Python3实现多线程聊天室主要涉及到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)
当有客户端想要连接聊天室服务器时,使用accept()函数来接受客户端连接请求,并返回一个新的套接字对象,用于客户端和服务器之间的通信。
while True:
# 等待客户端连接
client_socket, addr = server_socket.accept()
# 创建一个线程用于处理客户端的消息
threading.Thread(target=message_handle, args=(client_socket,)).start()
当有客户端连上服务器之后,需要使用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)
在处理客户端消息的时候,需要同时维护一个客户端列表,用于记录当前连接上服务器的所有客户端。
# 记录客户端连接
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()
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文件用于记录聊天的内容。