python3实现多线程聊天室

2023-12-17Python编程
29

Python3实现多线程聊天室主要涉及到socket编程和多线程编程两个方面。下面是实现的完整攻略:

  1. 创建Socket服务器

我们需要使用Python的socket模块,这个模块用来创建套接字对象,并提供了一系列接口来进行网络通信。

首先,需要使用socket()函数来创建一个套接字对象,并指定使用的网络协议(IPV4或IPV6)和套接字类型(UDP或TCP),一般使用TCP协议来创建聊天室服务器。

import socket

# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
server_socket.bind(('localhost', 9999)) 

# 设置最大连接数
server_socket.listen(5)
  1. 监听客户端连接

当有客户端想要连接聊天室服务器时,使用accept()函数来接受客户端连接请求,并返回一个新的套接字对象,用于客户端和服务器之间的通信。

while True:
    # 等待客户端连接
    client_socket, addr = server_socket.accept()

    # 创建一个线程用于处理客户端的消息
    threading.Thread(target=message_handle, args=(client_socket,)).start()
  1. 处理客户端消息

当有客户端连上服务器之后,需要使用recv()函数来接受客户端发送的消息,并使用send()函数将消息发送给其他客户端。

def message_handle(client_socket):
    while True:
        # 接受客户端发送的消息
        message = client_socket.recv(1024)

        # 将消息发送给其他客户端
        for conn in CLIENT_LIST:
            if conn is not client_socket:
                # 发送消息
                conn.send(message)
  1. 客户端维护

在处理客户端消息的时候,需要同时维护一个客户端列表,用于记录当前连接上服务器的所有客户端。

# 记录客户端连接
CLIENT_LIST = []

def message_handle(client_socket):
    global CLIENT_LIST

    # 将客户端套接字添加到客户端列表中
    CLIENT_LIST.append(client_socket)

    while True:
        # 接受客户端发送的消息
        message = client_socket.recv(1024)

        # 将消息发送给其他客户端
        for conn in CLIENT_LIST:
            if conn is not client_socket:
                # 发送消息
                conn.send(message)

    # 关闭套接字
    client_socket.close()
  1. 完整代码
import socket
import threading

# 记录客户端连接
CLIENT_LIST = []

# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
server_socket.bind(('localhost', 9999)) 

# 设置最大连接数
server_socket.listen(5)

def message_handle(client_socket):
    global CLIENT_LIST

    # 将客户端套接字添加到客户端列表中
    CLIENT_LIST.append(client_socket)

    while True:
        # 接受客户端发送的消息
        message = client_socket.recv(1024)

        # 将消息发送给其他客户端
        for conn in CLIENT_LIST:
            if conn is not client_socket:
                # 发送消息
                conn.send(message)

    # 关闭套接字
    client_socket.close()

while True:
    # 等待客户端连接
    client_socket, addr = server_socket.accept()

    # 创建一个线程用于处理客户端的消息
    threading.Thread(target=message_handle, args=(client_socket,)).start()

示例1:多客户端在同一时刻向服务器发送消息

启动服务器后,打开两个终端分别连接聊天室服务器。在任一终端中输入消息,可以在另一终端看到同样的消息。

示例2:服务器记录聊天日志

在服务器的代码中,可以新增一个日志功能来记录聊天的情况,如下所示:

def message_handle(client_socket):
    global CLIENT_LIST

    # 将客户端套接字添加到客户端列表中
    CLIENT_LIST.append(client_socket)

    while True:
        # 接受客户端发送的消息
        message = client_socket.recv(1024)

        # 记录聊天日志
        with open('chat_log.txt', 'a') as f:
            f.write(message.decode('utf-8'))

        # 将消息发送给其他客户端
        for conn in CLIENT_LIST:
            if conn is not client_socket:
                # 发送消息
                conn.send(message)

    # 关闭套接字
    client_socket.close()

在服务器的运行目录下,会新增一个chat_log.txt文件用于记录聊天的内容。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103