如何用Python实现跨LAN的客户端/服务端程序连接?
跨LAN设备TCP/UDP连接解决方案
以下是适配你场景的可行方法,无需修改路由器防火墙规则:
1. 公网服务器中转(最可靠)
找一台带公网IP的服务器(比如低成本VPS或免费测试服务器),让两台内网设备主动发起连接到这台中转服务器,由中转服务器负责转发双方的数据包。这种方式成功率最高,因为内网设备主动发起的出站请求几乎不会被路由器拦截。
简易Python中转示例
中转服务器代码:
import socket import threading def relay_data(source_conn, target_conn): while True: data = source_conn.recv(1024) if not data: break target_conn.sendall(data) source_conn.close() target_conn.close() # 初始化中转服务器 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('0.0.0.0', 9999)) server_socket.listen(2) # 等待两台设备连接 conn1, addr1 = server_socket.accept() conn2, addr2 = server_socket.accept() # 启动双向转发线程 threading.Thread(target=relay_data, args=(conn1, conn2)).start() threading.Thread(target=relay_data, args=(conn2, conn1)).start()
你的游戏客户端和服务端只需修改为连接中转服务器的9999端口,中转服务器会自动完成双方通信数据的互相转发。
2. NAT穿透(UDP优先)
如果不想依赖中转服务器,可以尝试NAT打洞,借助STUN协议获取设备的公网映射地址后直接连接:
- 用
pystun3库获取公网IP和端口:from pystun3 import get_ip_info # 公共STUN服务器示例 stun_server = "stun.qq.com" nat_type, external_ip, external_port = get_ip_info(stun_server=stun_server) print(f"公网映射地址: {external_ip}:{external_port}") - 让服务端将获取到的公网地址通过聊天、邮件等方式传递给客户端,客户端尝试用该地址直接发起连接。
- 注意:UDP打洞的成功率远高于TCP,若能接受UDP协议,优先采用此方案;TCP打洞对路由器NAT类型要求较高,成功率较低。
3. 利用开放特权端口(80/443)
多数路由器不会拦截80、443这类常用端口的出站/入站请求,你可以尝试:
- 直接让服务端绑定80端口(需管理员权限:Windows右键以管理员身份运行脚本,Linux加
sudo):import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('', 80)) # 绑定80端口 server.listen(1) conn, addr = server.accept() # 后续游戏通信逻辑 - 若80端口被系统占用,可通过端口转发工具(比如Windows的
netsh命令)将80端口流量转发到你的游戏端口:# Windows下,将本地80端口转发到12345端口 netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=12345 connectaddress=127.0.0.1
4. 集成P2P穿透SDK
部分P2P穿透服务提供Python SDK,直接集成到游戏代码中即可实现内网设备间连接,这类服务会自动处理NAT穿透和中转逻辑,无需自行搭建服务器。
内容的提问来源于stack exchange,提问作者Eric Concannon
相关产品推荐
相关产品推荐

