Python3 Socket文件接收脚本适配求助:原Python2.7代码无法运行
修复Python 3下的Socket文件接收脚本
嘿,我帮你定位到问题啦!你的脚本在Python 3里失效,核心原因是Python 3对字节和字符串做了严格区分,再加上几个语法细节的变化,导致程序无法正常终止或接收数据。下面是具体的修复方案:
问题根源
- 类型不匹配:Python 2中
socket.recv()返回的是字符串,但Python 3里它返回的是bytes对象。你原来用t == ""判断是否接收完毕,可空字符串和空bytes完全不是一回事,这就导致循环永远停不下来,程序会一直挂着等数据。 - 套接字关闭错误:你在循环里直接关了监听用的
s套接字,其实应该先关和客户端通信的conn,不然会造成资源泄漏。 - Print语法变化:Python 3里
print是个函数,必须加括号才行,Python 2里的写法在3里会报错。
修复后的完整代码
import socket (HOST, PORT) = ('', 19129) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(1) conn, addr = s.accept() print(f"已连接客户端: {addr}") # 加个提示,方便确认连接状态 with open('LightData.txt', 'wb') as f: while True: t = conn.recv(20) print(t) if not t: # 空bytes对象在布尔判断里是False,这样写更简洁 conn.close() # 先关掉和客户端的连接 break f.write(t) s.close() # 最后再关闭监听套接字
关键改动说明
- 字节判断优化:用
if not t代替原来的t == "",既符合Python 3的类型规则,写法也更简洁直观。 - 调整关闭顺序:先关闭客户端连接
conn,再关闭监听的s,避免不必要的资源占用。 - 修正Print语法:给
print加上括号,适配Python 3的语法要求。 - 新增连接提示:帮你快速确认是否和客户端成功建立连接,调试起来更方便。
这样修改后,你的脚本就能在Python 3环境下正常接收文件啦!
内容的提问来源于stack exchange,提问作者notsolowki
相关产品推荐
相关产品推荐

