Python+Socket库:打造多客户端TCP聊天程序及改进建议
我可以帮助你设计一个简单的聊天程序。为了简化问题,我们将使用Python和Socket库来创建一个基本的TCP聊天服务器和客户端。这个程序将允许多个客户端连接到服务器,并在客户端之间发送消息。 服务器端代码 首先,我们编写服务器端的代码: ```python import socket import threading # 全局变量,存储已连接的客户端套接字和地址 clients = [] def handle_client(client_socket, client_address): """处理客户端连接""" print(f"Accepted connection from {client_address}") # 将客户端套接字和地址添加到全局列表中 clients.append((client_socket, client_address)) try: while True: # 接收来自客户端的消息 message = client_socket.recv(1024).decode('utf-8') if not message: break # 客户端断开连接 # 广播消息给所有客户端 for client_sock, _ in clients: if client_sock != client_socket: client_sock.send(message.encode('utf-8')) except ConnectionResetError: print(f"Connection from {client_address} reset") finally: # 从全局列表中移除客户端 clients.remove((client_socket, client_address)) client_socket.close() def start_server(host='127.0.0.1', port=65432): """启动服务器""" server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((host, port)) server.listen(5) print(f"Server listening on {host}:{port}") while True: client_socket, client_address = server.accept() client_handler = threading.Thread(target=handle_client, args=(client_socket, client_address)) client_handler.start() if __name__ == "__main__": start_server() ``` 客户端代码 接下来,我们编写客户端的代码: ```python import socket import threading def receive_messages(sock): """接收来自服务器的消息""" while True: try: message = sock.recv(1024).decode('utf-8') if not message: break # 服务器断开连接 print(f"Received: {message}") except ConnectionResetError: print("Connection to server reset") break def start_client(host='127.0.0.1', port=65432, username='User'): """启动客户端""" client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((host, port)) print(f"Connected to server at {host}:{port}") # 启动接收消息的线程 receive_thread = threading.Thread(target=receive_messages, args=(client,)) receive_thread.start() try: while True: message = input(f"{username}> ") if message.lower() == 'exit': break client.send(message.encode('utf-8')) except KeyboardInterrupt: print("Client interrupted by user") finally: client.close() if __name__ == "__main__": start_client() ``` 运行程序 1. 启动服务器: 先运行服务器代码,它将监听指定的IP地址和端口(默认为`127.0.0.1:65432`)。 2. 启动客户端: 在另一个终端或计算机上运行客户端代码。你可以运行多个客户端实例来测试聊天功能。 改进建议 1. 添加用户列表:在服务器端维护一个用户名列表,并在客户端显示当前在线的用户。 2. 消息格式化:在发送消息时添加时间戳和用户名,以便更容易区分不同的消息和发送者。 3. 错误处理:增强错误处理逻辑,比如处理网络异常、客户端断开连接等情况,并给出更友好的提示信息。 ######[AI写代码神器 | 960点数解答 | 2024-12-25 17:47:51]
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)491
- Java 状态模式:模拟 TCP 连接多种状态及行为转换(GPT | 2147点数解答 | 2024-12-19 22:19:37)309
- Java实现状态模式:模拟TCP连接状态管理及行为处理(GPT | 1541点数解答 | 2024-12-19 22:19:57)292
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)445
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)438
- Python实现:打造交互式Tkinter聊天客户端(GPT | 1469点数解答 | 2024-10-30 13:14:13)324
- Python 实现:超详细在线聊天程序客户端代码解析(阿里通义 | 1065点数解答 | 2024-11-11 21:22:36)250
- Python 超全在线聊天程序服务器端代码及改进方案揭秘(阿里通义 | 1152点数解答 | 2024-11-11 21:24:15)218
- 探秘 ClientMain 类:Java 客户端代码解析(字节豆包 | 41点数解答 | 2024-11-15 18:00:17)263
- C++实现计算字符矩阵中十字图形个数(字节豆包 | 333点数解答 | 2026-03-14 19:46:38)45
- C++实现矩阵中十字图形个数的计算(字节豆包 | 847点数解答 | 2026-03-14 20:19:15)44
- C++计算字符矩阵中十字图形个数的实现与开发建议(字节豆包 | 720点数解答 | 2026-04-10 19:42:04)31