程序概述
这是一个使用Python socket模块实现的多线程聊天程序,包含客户端(chat_client.py
)和服务器(chat_server.py
)两部分。程序实现了基本的客户端间消息转发功能。
服务器端分析 (chat_server.py
)
核心功能
-
用户管理:使用字典
user_dic
存储所有连接的客户端,键是客户端地址(IP,端口),值是对应的socket连接对象。 -
消息转发:接收一个客户端的消息后,解析出目标客户端地址,并将消息转发给目标客户端。
代码结构
import socket
from threading import Thread
user_dic = {} # 存储所有客户端连接
def send_recv(client_conn, client_addr):
# 处理客户端消息的主循环
while True:
res = client_conn.recv(1024).decode("utf-8")
print(f"客户端发送的消息:{res}")
# 解析目标客户端地址
tu = (res.split(":")[0], int(res.split(":")[1]))
client_conn2 = user_dic.get(tu) # 获取目标客户端socket
if client_conn2 is None:
print("对方已下线")
else:
# 转发消息
message = "%s账户对您说%s"%(client_addr[0], res.split(":")[2])
client_conn2.send(message.encode("utf-8"))
if __name__ == '__main__':
server_socket = socket.socket()
server_socket.bind(('172.16.1.4', 8081))
server_socket.listen()
while True:
print("等待客户端连接")
client_conn, client_addr = server_socket.accept()
print("客户端连接成功")
user_dic[client_addr] = client_conn # 存储新客户端
Thread(target=send_recv, args=(client_conn, client_addr)).start()
关键点
-
多线程处理:每个客户端连接都会创建一个新线程(
Thread
)来处理消息。 -
消息格式:服务器期望的消息格式为
IP:端口:消息内容
。 -
用户字典:
user_dic
全局存储所有活跃连接,便于消息转发。
客户端分析 (chat_client.py
)
核心功能
-
消息发送:从控制台输入消息并发送到服务器。
-
消息接收:接收服务器转发的消息并显示。
代码结构
import socket
from threading import Thread
def send_msg(client_socket):
while True:
msg = input("请输入要发送的消息:\n")
client_socket.send(msg.encode("utf-8"))
def recv_msg(client_socket):
while True:
msg = client_socket.recv(1024).decode("utf-8")
print(msg)
if __name__ == '__main__':
client_socket = socket.socket()
client_socket.bind(("172.16.1.4", 8082)) # 绑定本地端口
client_socket.connect(('172.16.1.4', 8081)) # 连接服务器
print(client_socket.getsockname()) # 打印本地地址信息
# 启动发送和接收线程
Thread(target=send_msg, args=(client_socket,)).start()
Thread(target=recv_msg, args=(client_socket,)).start()
关键点
-
双线程设计:一个线程负责发送消息,另一个负责接收消息。
-
绑定端口:客户端也绑定了固定端口(8082),这在实际应用中可能需要动态分配。
-
简单交互:通过控制台输入输出实现简单交互。
程序工作流程
-
服务器启动,监听8081端口
-
客户端启动,连接服务器,绑定8082端口
-
客户端A发送消息格式为
目标IP:目标端口:消息内容
-
服务器解析消息,查找目标客户端B的连接
-
服务器将消息转发给客户端B
-
客户端B接收并显示消息
改进建议
-
消息协议:定义更完善的消息协议,如使用JSON格式包含发送者、接收者、消息内容等。
-
异常处理:添加更多异常处理,如连接断开、消息格式错误等。
-
动态端口分配:客户端端口可以动态分配,避免冲突。
-
心跳机制:检测客户端是否在线,及时清理
user_dic
中的无效连接。 -
日志记录:添加日志功能,便于调试和问题追踪。
总结
这个程序展示了Python socket和多线程编程的基本应用,实现了简单的客户端间消息转发功能。虽然功能相对简单,但包含了网络编程的核心概念,适合作为学习案例。读者可以在此基础上扩展更复杂的功能,如群聊、文件传输、用户认证等。