Python Socket局域网可用公网无法通信如何修改代码?
公网Socket通信修改方案
你当前程序仅能在局域网运行的核心原因是服务端绑定了内网私有IP,且公网到内网的流量转发通道没有打通,公网请求无法直接触达内网的服务端设备,按以下步骤调整即可:
第一步:先完成网络层配置(必须前置操作,否则代码修改无效)
- 先确认你的宽带是否具备公网IP:在服务端设备上直接搜索「公网IP」,如果查到的IP是10、172.16-31、192.168开头的私有地址,说明运营商做了多层NAT,需要先联系运营商申请公网IP。
- 登录路由器管理后台,找到端口映射/虚拟服务器功能,新增映射规则:外部端口填2101,内部端口填2101,内部IP填服务端设备的内网IP
192.168.1.56,协议选择TCP,保存后生效。 - 记录下你的路由器公网IP,后续客户端需要连接这个地址。
第二步:代码修改
服务端server.py调整
把原固定绑定内网IP的逻辑改成监听所有网卡,这样既可以接收内网请求,也能接收路由器转发过来的公网请求,修改后代码如下:
#server.py 修改后 import socket import pyautogui server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 0.0.0.0代表监听本机所有网卡的请求 server.bind(("0.0.0.0",2101)) server.listen(5) klienti , addr = server.accept() asdf = pyautogui.prompt("mesiji:") klienti.send(bytes(asdf,"utf-8"))
客户端client.py调整
把原连接的内网IP替换成你记录的路由器公网IP即可:
#client.py 修改后 import socket import pyautogui server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 把引号内的内容替换成你实际的公网IP server.connect(("你的路由器公网IP",2101)) mesiji = server.recv(1024) pyautogui.alert(mesiji.decode("utf-8"))
额外注意事项
- 家用宽带普遍会封禁80、443、8080这类常用端口,你用的2101属于高位端口,一般不会被封,若测试仍无法连接,可以更换10000-65535区间的其他端口,同步修改端口映射规则和代码里的端口号即可。
- 需确认服务端设备防火墙放开了2101端口的TCP入站规则,客户端设备防火墙放开2101端口的TCP出站规则,避免流量被防火墙拦截。
- 若运营商无法提供公网IP,可以用内网穿透工具替代端口映射,配置逻辑为将内网服务端的2101端口映射到穿透工具的公网节点端口,客户端连接穿透工具提供的公网地址即可。
内容的提问来源于stack exchange,提问作者jemala4424
相关产品推荐
相关产品推荐

