首页 后端开发 Python教程 Python 中的 TCP 聊天室

Python 中的 TCP 聊天室

Jan 04, 2025 pm 07:16 PM

TCP Chatroom in Python

介绍

在这篇博客中,我们将使用 Python 实现一个功能齐全的 TCP 聊天室。我们将拥有一台服务器来托管房间,以及多个客户端连接到它并相互通信。

关于 TCP 和客户端服务器架构

传输控制协议是一种面向连接的通信协议,有助于通过网络在不同设备之间交换消息。

为了实现我们的聊天室,我们将使用客户端-服务器架构。这意味着我们将拥有多个客户端(用户)和一台中央服务器来托管所有内容并为这些客户端提供数据。


设置服务器(server.py)

1.为了设置我们的基础服务器,我们需要导入两个库,即套接字和线程。套接字库将用于建立和设置网络连接,线程库是同时执行各种任务所必需的。

import socket
import threading
登录后复制
登录后复制
登录后复制

2. 下一个任务是定义我们的服务器数据并初始化我们的套接字。我们需要主机的 IP 地址和服务器的可用端口号。在本博客中,我们将使用地址 127.0.0.1,即我们的 localhost 和端口 5500

端口号无关紧要,但您必须确保您使用的端口是免费且未被保留。如果您在实际服务器或虚拟机上运行此聊天室,请将聊天室服务器的 IP 地址指定为虚拟机或服务器的主机 IP 地址

查看此保留端口号列表以获取更多信息。


# Server Data
host = '127.0.0.1'
port = 5500
登录后复制
登录后复制
登录后复制

3. 当我们定义套接字时,我们需要传递两个参数。这些定义了我们要使用的套接字类型。第一个 (AF_INET) 表明我们使用的是互联网套接字而不是 unix 套接字。第二个参数代表我们要使用的协议。 SOCK_STREAM 表示我们正在使用 TCP。

定义套接字后,我们通过传递包含这两个值的

元组将其绑定或附加到我们的主机和指定端口。然后我们将服务器置于监听模式,以便它等待客户端连接并发送消息..

# Start the Server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()
登录后复制
登录后复制
登录后复制

4.我们还将创建两个空列表,稍后我们将用它们来存储连接的客户端及其昵称。

import socket
import threading
登录后复制
登录后复制
登录后复制

5.现在我们将定义所有有助于我们广播消息的函数。它将向每个连接的客户端发送一条消息,因此会出现在客户端列表中。

# Server Data
host = '127.0.0.1'
port = 5500
登录后复制
登录后复制
登录后复制

6.现在我们将创建一个handle()函数。该函数将负责处理来自客户端的消息。该函数将在 while 循环中运行。该函数将接受客户端作为参数并无限循环地处理它,直到发生错误或客户端本身断开连接。

# Start the Server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()
登录后复制
登录后复制
登录后复制

7. 现在我们必须接收来自客户端的消息并将其广播给所有连接的客户端。因此,当一个客户端发送一条消息时,其他人都可以通过broadcast()函数看到该消息。现在,如果由于某种原因与该客户端的连接出现错误,我们将删除它及其昵称,关闭连接并广播该客户端已离开聊天。

# Lists For Clients and Their Nicknames
clients = []
nicknames = []
登录后复制
登录后复制

当我们准备好运行我们的服务器时,我们将执行这个接收函数。一旦客户端连接到服务器,它就会向服务器发送字符串“NAME”,这将告诉客户端请求其昵称。之后,它等待响应并将具有相应昵称的客户端附加到列表中,并为该特定客户端的handle()函数启动一个线程。

8. 现在我们可以运行这个函数,我们的服务器就完成了。

# Sending Messages To All Connected Clients
def broadcast(message):
    for client in clients:
        client.send(message)
登录后复制

设置客户端(client.py)

现在我们要实现我们的客户端。为此,我们将再次需要导入相同的库。

# Handling Clients
def handle(client):
    while True:
        try:
            # Broadcasting Messages
            message = client.recv(1024)
            broadcast(message)
        except:
            # Removing And Closing Clients
            index = clients.index(client)
            clients.remove(client)
            client.close()
            nickname = nicknames[index]
            broadcast('{} left!'.format(nickname).encode('ascii'))
            nicknames.remove(nickname)
            break
登录后复制

1. 客户端的第一步是选择昵称并连接到我们的服务器。我们需要知道服务器运行的确切地址和端口。作为客户端,我们连接到现有服务器,而不是绑定数据和监听。

# Receiving `Function
def receive():
    while True:
        # Accept Connection
        client, address = server.accept()
        print("Connected with {}".format(str(address)))

        # Request And Store Nickname
        client.send('NAME'.encode('ascii'))
        nickname = client.recv(1024).decode('ascii')
        nicknames.append(nickname)
        clients.append(client)

        # Print And Broadcast Nickname
        print("Nickname is {}".format(nickname))
        broadcast("{} joined!".format(nickname).encode('ascii'))
        client.send('Connected to server!'.encode('ascii'))

        # Start Handling Thread For Client
        thread = threading.Thread(target=handle, args=(client,))
        thread.start()
登录后复制

2. 现在,客户端需要有两个同时运行的线程。第一个将不断从服务器接收数据,第二个将向服务器发送我们自己的消息。

receive()
登录后复制

这里又出现了一个无限的 while 循环。它不断尝试接收消息并将其打印到屏幕上。但是,如果消息是“NAME”,它不会打印它,而是将其昵称发送到服务器。

书写功能相当短。它还以无限循环运行,始终等待用户的输入。一旦获得一些,它就会将其与昵称结合起来并发送给服务器。

3.我们需要做的最后一件事是启动两个运行这两个函数的线程。

import socket
import threading
登录后复制
登录后复制
登录后复制

现在我们完成了。我们有一个功能齐全的服务器和可以连接到它并相互通信的工作客户端。


运行聊天室

我们来测试一下吧。请记住,我们始终需要先启动服务器,否则客户端无法连接到不存在的主机。

*服务器日志:*

# Server Data
host = '127.0.0.1'
port = 5500
登录后复制
登录后复制
登录后复制

*客户端一日志:*

# Start the Server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()
登录后复制
登录后复制
登录后复制

*客户端二日志:*

# Lists For Clients and Their Nicknames
clients = []
nicknames = []
登录后复制
登录后复制

我们已经成功地用Python创建了一个基于传输控制协议的聊天室! ? ?

在此处查找完整代码:https://github.com/rajatuiwebdev/tcp-chatroom-in-python
在 Instagram 上关注我: https://instagram.com/rajatrajput.dev
在 LinkedIn 上关注我: https://linkedin.com/in/rajatrajput2004

以上是Python 中的 TCP 聊天室的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1658
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1231
24
Python vs.C:申请和用例 Python vs.C:申请和用例 Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。 Python以简洁和强大的生态系统着称,C 则以高性能和底层控制能力闻名。

您可以在2小时内学到多少python? 您可以在2小时内学到多少python? Apr 09, 2025 pm 04:33 PM

两小时内可以学到Python的基础知识。1.学习变量和数据类型,2.掌握控制结构如if语句和循环,3.了解函数的定义和使用。这些将帮助你开始编写简单的Python程序。

Python:游戏,Guis等 Python:游戏,Guis等 Apr 13, 2025 am 12:14 AM

Python在游戏和GUI开发中表现出色。1)游戏开发使用Pygame,提供绘图、音频等功能,适合创建2D游戏。2)GUI开发可选择Tkinter或PyQt,Tkinter简单易用,PyQt功能丰富,适合专业开发。

2小时的Python计划:一种现实的方法 2小时的Python计划:一种现实的方法 Apr 11, 2025 am 12:04 AM

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

Python与C:学习曲线和易用性 Python与C:学习曲线和易用性 Apr 19, 2025 am 12:20 AM

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

Python和时间:充分利用您的学习时间 Python和时间:充分利用您的学习时间 Apr 14, 2025 am 12:02 AM

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Python:探索其主要应用程序 Python:探索其主要应用程序 Apr 10, 2025 am 09:41 AM

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

Python:自动化,脚本和任务管理 Python:自动化,脚本和任务管理 Apr 16, 2025 am 12:14 AM

Python在自动化、脚本编写和任务管理中表现出色。1)自动化:通过标准库如os、shutil实现文件备份。2)脚本编写:使用psutil库监控系统资源。3)任务管理:利用schedule库调度任务。Python的易用性和丰富库支持使其在这些领域中成为首选工具。

See all articles