Python Socket编写简易HTTP协议时卡在receiver1无法传输图片如何解决
问题排查与修复方案
你遇到的卡住问题核心是线程创建方式错误,其次还有多处语法、逻辑错误,逐一修复如下:
1. 首要错误:线程传参错误(直接导致程序卡住)
你创建线程时写的target=receiver1()属于直接执行函数,不是把函数对象传给线程,主线程运行到这一步会直接进入receiver1的死循环,根本不会启动子线程,也不会执行后续的sender逻辑。
修正main函数里的线程创建代码:
# 原错误写法 # t2 = threading.Thread(target=receiver1(), args=('This is thread 2',)) # t1 = threading.Thread(target=sender1(getSeverIP(severip)), args=('This is thread 1',)) # 修正后写法:target传函数名,参数放到args里 t2 = threading.Thread(target=receiver1) t2.start() t1 = threading.Thread(target=sender1, args=(getSeverIP(severip),)) t1.start()
2. receiver1模块错误修复
- 缺少socket导入,顶部需加导入语句
- 文件打开语法错误,引号拼接错误
- with块不需要手动关闭文件
- 单次recv只能接收固定大小数据,大图会接收不全,改为循环接收
修正后代码:
from socket import socket, AF_INET, SOCK_STREAM def receiver1(): receive_port = 25000 server_socket = socket(AF_INET, SOCK_STREAM) server_socket.bind(('', receive_port)) server_socket.listen(2) print('The computer is ready to receive') while True: connection_socket, addr = server_socket.accept() # 循环接收所有数据 r_msg = b'' while True: part = connection_socket.recv(20480) if not part: break r_msg += part # 修正文件打开语法 with open("xjtlu2.jpg", "wb") as f: f.write(r_msg) transmit_done = "done!" connection_socket.send(transmit_done.encode()) connection_socket.close() server_socket.close()
3. sender1模块错误修复
- 缺少socket导入,顶部需加导入语句
- 发送数据时调用对象错误,
socket.send要改为client_socket.send - 增加空列表判断,避免share文件夹为空时索引越界报错
- 发送完主动关闭写端,告诉接收端数据已全部发送完成,避免接收端一直卡住等待
修正后代码:
import os from socket import socket, AF_INET, SOCK_STREAM def get_the_files(): paths = [] if os.path.isdir('share'): print("the folder is exist") print("seeking files in the folder") for filepath, dirname, filenames in os.walk(r'share'): for filename in filenames: print(filename) paths.append(os.path.join(filepath, filename)) else: print('the folder is not exist, build a new one ') os.makedirs("share") print(paths) return paths def sender1(tip): print("1") target_ip2 = tip print(target_ip2) target_port = 25000 print(target_port) client_socket = socket(AF_INET, SOCK_STREAM) client_socket.connect((target_ip2, target_port)) files = get_the_files() # 避免空列表报错 if not files: print("share文件夹下无文件") client_socket.close() return print(files[0]) with open(files[0], "rb") as f: msg = f.read() # 修正发送对象错误 client_socket.send(msg) # 发送完主动关闭写端,告诉接收端数据发完了 client_socket.shutdown(1) feedback_1 = client_socket.recv(20480) print('From Server:', feedback_1.decode()) client_socket.close()
4. 主代码优化点
主代码里声明的global severIp没有实际用到,可以直接删除,不影响运行。
改完以上所有点即可正常运行,图片可以正常传输。
内容的提问来源于stack exchange,提问作者tobyteng
相关产品推荐
相关产品推荐

