如何用Python实现不同网络下两台设备的屏幕共享?
跨网络屏幕共享实现方案
你现在的代码只能在同网环境下运行,核心问题是接收端绑定了127.0.0.1——这个地址仅监听本地回环接口,外部网络无法访问到服务。下面给你几个可行的解决思路:
方案一:端口映射(最直接的方法)
适合能操作路由器的场景,比如家庭宽带环境。
步骤:
- 修改接收端绑定地址:把
receiver.py里的127.0.0.1换成0.0.0.0,让服务器监听所有可用网络接口:
from vidstream import StreamingServer import threading # 绑定到所有网络接口 receiver = StreamingServer('0.0.0.0', 9999) t = threading.Thread(target=receiver.start_server) t.start() while input("") != 'STOP': continue receiver.stop_server()
- 获取接收端公网IP:在接收端机器上用命令行执行
curl ifconfig.me,或通过浏览器查询公网IP,比如113.xx.xx.xx。 - 路由器设置端口转发:登录路由器管理后台(通常是
192.168.1.1或192.168.0.1),找到「端口转发」/「虚拟服务器」选项,添加规则:- 外部端口:9999(与脚本端口一致)
- 内部IP:接收端的局域网IP(用
ipconfig/ifconfig查询,比如192.168.1.105) - 内部端口:9999
- 协议选择TCP
- 修正客户端代码并修改连接地址:把
client.py里的127.0.0.1换成接收端的公网IP,同时修正原代码里的笔误(最后一行应该调用sender的停止方法):
from vidstream import ScreenShareClient import threading # 替换成接收端的公网IP sender = ScreenShareClient('113.xx.xx.xx', 9999) t = threading.Thread(target=sender.start_stream) t.start() while input("") != 'STOP': continue sender.stop_stream() # 修正原代码的笔误
补充说明:
- 如果你的公网IP是动态的(大部分家庭宽带都是),可以使用动态域名解析(DDNS)服务,将域名绑定到动态IP,避免每次更换IP的麻烦。
- 记得给接收端机器的防火墙开放9999端口的入站权限:Windows在防火墙中添加规则,Linux执行
ufw allow 9999/tcp。
方案二:内网穿透工具(无需操作路由器)
如果没有路由器操作权限,或嫌端口映射麻烦,可以使用现成的内网穿透工具,比如ngrok、frp等。
用ngrok的示例:
- 下载ngrok并注册账号,获取authtoken后完成配置。
- 在接收端机器上运行命令,将本地9999端口映射到公网:
ngrok tcp 9999
运行后会输出一个公网地址,比如tcp://0.tcp.ngrok.io:12345。
3. 修改client.py的连接地址:IP填写0.tcp.ngrok.io,端口填写12345,接收端仍需绑定0.0.0.0。
方案三:P2P方式(无需公网IP)
不想依赖公网IP或第三方工具的话,可以使用P2P库(比如基于WebRTC的aiortc),让两台机器直接建立连接。不过这个方案需要自行实现更多逻辑,比vidstream的封装更复杂,适合有一定开发基础的场景。
内容的提问来源于stack exchange,提问作者Ryan Pflum
相关产品推荐
相关产品推荐

