You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:54:03