如何在 Python 中创建一个简单的聊天室

2024 年 8 月 29 日 | 阅读 6 分钟

本教程将教我们如何用 Python 创建一个聊天室,并且我们将简要了解套接字编程和多线程。在深入研究这个主题之前,让我们先简要介绍一下聊天室。

什么是聊天室?

聊天室是一个空间,全球多个用户可以在其中就共同的兴趣进行交流。他们可以就任何话题进行对话。它使用户能够学习新事物并分享他们的想法。我们将创建一个简单的实时聊天室,使用 Python 来更深入地理解聊天室。

什么是套接字编程?

在网络术语中,套接字(socket)是通信通道中的一个端点,它是双向的,并建立服务器与一个或多个客户端之间的通信。套接字位于客户端,服务器端将其自身与服务器端上的某个端口相关联。为了让客户端与同一套接字通信,套接字必须与同一端口相关联。

套接字编程指的是连接网络上的两个节点以相互通信。服务器形成监听套接字,而客户端则连接到服务器。

什么是多线程?

线程是与一组命令相关的子进程,是任何其他线程的独立部分。因此,每次用户连接到服务器时,都会为该用户创建一个单独的线程。当用户与服务器通信时,会根据套接字对象为每个客户端创建一个单独的线程。

我们需要实现两个脚本来建立聊天室。一个是持续运行的服务器,另一个是每个客户端运行以连接到服务器的客户端。

实现服务器端套接字编程

服务器从客户端接收连接以建立网络接口。我们的服务器端 Python 脚本将尝试验证套接字,并将其绑定到用户指定的 IP 地址和端口。Windows 用户可能会在防火墙设置中遇到指定端口号的异常,或者可以使用一个已打开的端口。此脚本将持续运行以接受套接字连接请求,并将相应的套接字对象添加到列表中,以跟踪活动连接。每次用户想要与服务器建立连接时,都会为该用户创建一个单独的线程。在每个线程中,服务器等待一条消息,然后将该消息发送给当前在聊天室中的其他用户。当服务器在从特定线程接收消息时遇到错误,它将删除该出错的线程。

让我们开始编写服务器端代码。我们创建了一个名为 server.py 的文件。

  • 导入库

首先,我们将导入包含实现套接字所需方法的 socket 库。sys 库附带系统模块,该模块负责提供与系统目录、函数和方法相关的数据。time 模块允许处理时间函数。

  • 创建套接字并检索主机名

上述代码使用 socket() 函数创建套接字连接。套接字创建后,我们使用 gethostname() 函数提取主机名/本地名称。gethostname() 函数在发送 host_name 作为参数时,会检索另一个用户的 IP 地址,该地址存储在 socket_ip 中。我们将端口号设置为 8080。我们可以选择此端口,因为它在大多数机器上是默认端口。其他端口,如 3000、5000 等,通常用于 express.js。我们也可以使用端口 '555' 来运行。

  • 绑定主机和端口

bind() 函数允许我们将端口和主机绑定在一起,这在 socket 对象 new_socket 上被调用。成功绑定后,我们将打印消息“Bind Successfully”。

  • 监听连接

listen() 函数接受一个参数,即 numbers_of_connections。此参数可以是任何数字,例如 1、2、3……。

  • 接受传入连接

在上述代码中,conn 变量表示与套接字的连接,变量 'add' 被赋值为客户端的 IP 地址。

  • 保存传入连接数据

传入的连接请求及其详细信息存储在 client_name 变量中。客户端名称最多可以超过 1024 字节。它在服务器端被解码,并打印一条消息表明已连接。然后服务器发送主机名。

  • 传输数据包/消息

用户输入消息。它使用 encode() 函数进行编码,然后通过套接字传输。send() 函数用于发送消息。此函数在早期调用 accept() 函数期间创建的连接对象上调用。之后,它显示消息“the message has been delivered。”

使用 conn 对象的 recv() 函数接收传入消息。它可以接收 1024 字节的信息。decode() 方法在服务器端解码消息。

完整的服务器端代码

现在让我们看看客户端套接字编程

聊天室客户端套接字编程

现在,我们将创建一个名为 client.py 的文件,并编写代码以与聊天服务器进行通信。

  • 导入库

我们导入了与服务器端相同的库。

  • 创建套接字并接受用户输入的hostname

与服务器端相同,使用 socket() 函数创建套接字连接。套接字创建后,我们使用 gethostname() 函数提取主机名/本地名称。gethostname() 函数在发送 host_name 作为参数时,会检索另一个用户的 IP 地址,该 IP 地址存储在 socket_ip 中。我们将端口号设置为 8080。

  • 连接到服务器

首先输入另一个服务器的详细信息。输入正确的 IP 地址很重要,否则通信将失败。服务器的主机名和端口以某种方式绑定在一起并连接到套接字。

  • 从服务器接收数据包/消息

recv() 函数接收数据并接受 1024 字节的数据。它存储在 message 对象中,并使用 decode() 函数进行解码。消息与服务器主机名和接收到的消息一起打印。客户端可以键入任何消息作为输入,对其进行编码,并使用套接字将其发送到服务器。

完整的客户端代码

结论

在本教程中,我们解释了如何使用 Python 创建一个简单的聊天室。我们讨论了聊天室的术语以及如何编写客户端和服务器端的代码。您可以复制这两个代码并在您的机器上运行它们,从而在终端上获得简单的聊天室界面。