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

同一网络下设备间对象传输方法咨询(附本地测试代码)

同一局域网内跨设备对象传输问题解决

你的代码确实只能本地运行

原因很直接:

  • 服务器端用socket.gethostname()绑定地址,这会让服务器只监听本地主机名对应的回环地址(127.0.0.1)或本地专属IP,其他局域网设备无法访问。
  • 客户端同样用socket.gethostname(),只会尝试连接自己设备的本地端口,自然只能连本地服务器。

可行解决方案

1. 修改服务器监听地址

把服务器的绑定地址改成'0.0.0.0',这样服务器会监听所有可用的网络接口,包括局域网IP,允许其他设备连接。

2. 客户端指定服务器的局域网IP

客户端连接时,不能再用socket.gethostname(),必须替换成服务器设备的实际局域网IP(比如192.168.1.100这类格式)。

3. 处理对象传输(而非字符串)

原生socket只能传字节流,要传输Python对象,需要先序列化(把对象转成字节),接收后再反序列化。常用的序列化方式有两种:

  • pickle:Python专属,支持几乎所有Python对象,但不能跨语言使用。
  • json:跨语言通用,但只支持基础数据类型(字典、列表、字符串等)。

修改后的完整代码示例

服务器端(支持局域网连接+pickle序列化对象)

# 服务器端
import socket
import pickle

# 绑定到所有网络接口,监听5034端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 5034))
s.listen(5)

while True:
    clt, adr = s.accept()
    print(f"已连接来自 {adr} 的客户端")
    
    # 准备要传输的测试对象
    send_obj = {"type": "用户数据", "content": ["张三", 25, "工程师"]}
    # 序列化对象为字节
    serialized_obj = pickle.dumps(send_obj)
    # 发送数据
    clt.send(serialized_obj)
    clt.close()

客户端(连接局域网服务器+反序列化对象)

# 客户端
import socket
import pickle

# 替换成你的服务器局域网IP,比如192.168.3.12
SERVER_IP = '192.168.3.12'
SERVER_PORT = 5034

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((SERVER_IP, SERVER_PORT))

# 接收序列化后的对象数据(缓冲区大小可根据对象调整)
received_data = s.recv(4096)
# 反序列化得到原对象
received_obj = pickle.loads(received_data)
print("收到的对象:", received_obj)
s.close()

额外注意事项

  • 获取服务器局域网IP:Windows用ipconfig,Linux/macOS用ip addr或ifconfig,找到对应网卡的IPv4地址(通常是192.168.x.x或10.x.x.x)。
  • 防火墙设置:服务器设备要开放5034端口的TCP连接,或者临时关闭防火墙测试,否则客户端会连接失败。
  • 跨语言需求:如果需要和非Python设备传输,把pickle换成json即可:服务器用json.dumps(send_obj).encode('utf-8')序列化,客户端用json.loads(received_data.decode('utf-8'))反序列化。

内容的提问来源于stack exchange,提问作者key_alt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:09:21