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

Python Socket服务器跨网连接超时问题求助

解决Socket双人聊天程序跨网络连接超时问题(WinError 10060)

问题描述

本地运行双人聊天测试程序正常,但朋友运行client.py时出现连接超时错误,报错信息如下:

File "C:\Users\Username\Downloads\client.py", line 7, in s.connect((HOST, PORT))
TimeoutError: [WinError 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应

相关代码

server.py

import socket

HOST = socket.gethostbyname(socket.gethostname())
PORT = 65432  
print(HOST)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print(f"Connected by {addr}")
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

client.py

import socket

HOST = "我本地通过socket.gethostbyname(socket.gethostname())获取的IP" 
PORT = 65432 

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b"Hello, world")
    data = s.recv(1024)

print(f"Received {data!r}")

问题原因

  1. 服务器绑定私有IP:socket.gethostbyname(socket.gethostname())获取的是局域网私有IP(如192.168.x.x),仅局域网内可访问,外部网络无法连接。
  2. 端口未映射:路由器默认阻止外部网络访问内部端口,需手动设置端口映射暴露服务端口。
  3. 防火墙拦截:本地Windows防火墙可能禁止了65432端口的入站连接请求。

解决方案

  • 修改服务器绑定地址
    将server.py中的HOST改为0.0.0.0,让服务器监听所有网络接口:

    HOST = "0.0.0.0"
    
  • 使用公网IP作为客户端目标地址
    浏览器搜索“我的公网IP”获取你的公网IP,替换client.py中的HOST值。

  • 配置路由器端口映射
    登录路由器管理后台,找到“端口映射”/“虚拟服务器”选项,添加规则:

    • 外部端口:65432
    • 内部IP:你的本地私有IP(即原server.py输出的IP)
    • 内部端口:65432
    • 协议:TCP
  • 放行防火墙入站端口
    打开Windows Defender防火墙高级设置,新建入站规则:

    1. 选择“端口”类型,下一步
    2. 勾选TCP,输入本地端口65432,下一步
    3. 选择“允许连接”,下一步
    4. 勾选所有适用网络类型,下一步
    5. 命名规则并完成

测试建议

先让朋友在同一局域网内使用你的私有IP测试client.py,确认局域网内可连接后,再处理公网连接的端口映射和防火墙配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:10:25