如何让Socket服务端接收客户端消息并按指定格式展示内容?
Socket服务端按指定格式打印客户端消息解决方案
核心修改说明
- 修正客户端收发逻辑冲突问题,拆分消息监听和消息发送两个独立逻辑
- 客户端发送消息时按照要求拼接
{name} send message: {content}格式后再上传到服务端 - 服务端新增异常处理,避免客户端异常断开时服务端崩溃,接收消息后直接解码打印即可
修改后完整代码
服务端代码
import threading import socket HOST = '127.0.0.1' PORT = 8888 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((HOST, PORT)) server.listen(15) print(f'Server {HOST}:{PORT} start.') users = [] def send_all(data): for user in users: try: user.send(data) except: users.remove(user) user.close() def listen_user(user): print('新客户端接入,开始监听消息') while True: try: data = user.recv(1024) if not data: users.remove(user) user.close() break # 客户端已按要求拼接好格式,直接解码打印 print(data.decode('utf-8')) send_all(data) except: users.remove(user) user.close() break def start_server(): while True: user_socket, addr = server.accept() users.append(user_socket) potok_info = threading.Thread(target=listen_user, args=(user_socket,), daemon=True) potok_info.start() if __name__ == '__main__': start_server()
客户端代码
import socket import threading import os HOST = '127.0.0.1' PORT = 8888 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((HOST, PORT)) # 仅负责监听服务端转发的其他用户消息 def listen_message(): while True: try: data = client.recv(1024) if not data: break print(f'\n{data.decode("utf-8")}') except: print('与服务端断开连接') client.close() break def send_server(): print('Enter name: ') name = input().strip() # 启动后台消息监听线程 listen_thread = threading.Thread(target=listen_message, daemon=True) listen_thread.start() os.system('clear') print('***** Welcome in Security Chat. *****') while True: try: input_msg = input('you: ').strip() if input_msg: # 按要求拼接消息格式后发送 send_msg = f'{name} send message: {input_msg}' client.send(send_msg.encode('utf-8')) except: print('消息发送失败') client.close() break if __name__ == '__main__': os.system('clear') send_server()
内容的提问来源于stack exchange,提问作者Sap2ch
相关产品推荐
相关产品推荐

