Socket持续收发问题:首次回复后服务器再发消息的解决求助
搞定多轮服务器交互的问题
嘿,我看出来你遇到的问题了——首次回复服务器后,对方又发了新消息,但你的代码没处理后续交互的逻辑对吧?从你贴的片段来看,只写了连接初始化的部分,完全没做循环接收回复的处理,这就是为啥应付不了多轮验证的原因。
问题出在哪
服务器的验证流程明显是多轮对话:第一次给你发挑战,你回复后,它再发第二次验证请求,而你的代码只准备了一次交互的能力,自然接不住后续消息。
给你补全的完整代码
我把循环处理的逻辑加上了,还完善了异常处理和资源清理,应该能解决你的问题:
# -*- encoding: utf-8 -*- import socket from decryptmsg import decryptmsg from cleanmsg import cleanmsg # 服务器连接信息 ip = "<IP>" port = 4000 def handle_server_check(): # 创建socket实例 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: # 连接服务器 sock.connect((ip, port)) print("成功连到服务器啦") # 循环处理多轮消息 while True: # 接收服务器消息,缓冲区大小可以根据实际调整 raw_msg = sock.recv(1024) if not raw_msg: print("服务器断开连接了") break # 解码收到的消息,注意和服务器编码保持一致 received = raw_msg.decode('utf-8').strip() print(f"收到服务器消息: {received}") # 按你的流程处理消息:解密 -> 清理 decrypted = decryptmsg(received) cleaned = cleanmsg(decrypted) # 把处理后的消息发回去 sock.sendall(cleaned.encode('utf-8')) print(f"已发送回复: {cleaned}") except ConnectionRefusedError: print("连不上服务器哦,检查下IP和端口对不对") except Exception as err: print(f"出问题啦: {str(err)}") finally: # 不管咋样都要关掉socket sock.close() print("连接已经关闭") if __name__ == "__main__": handle_server_check()
几个关键改进的地方
- 加了**
while True循环**:一直等着服务器发消息,直到对方主动断开 - 完善了异常处理:连接失败、其他错误都能友好提示,不会直接崩掉
- 明确了编码处理:统一用utf-8编解码,要是服务器用别的编码你改一下就行
- 加了资源清理:用
finally保证socket一定会关闭,避免资源浪费
额外要注意的点
- 如果服务器发的消息很长,超过1024字节,你得调整
recv()的大小,或者写个循环把完整消息收下来 - 要确认你的
decryptmsg和cleanmsg函数能处理服务器第二轮发的消息,别只适配了第一轮的格式 - 要是服务器有"验证完成"的结束消息,你可以在循环里加个判断,收到就主动退出,不用等对方断开
内容的提问来源于stack exchange,提问作者Olli
相关产品推荐
相关产品推荐

