Python互联网对等聊天系统
我想建立一个点对点的聊天引擎,让它可以在互联网上运行。目前我的代码在本地网络上可以正常工作,但在更远的地方就不行了。这是因为用Python的sockets
监听的端口,只能在局域网内使用,外部网络是无法访问的。
我可以接受对方需要知道我的IP地址(还有我监听的端口)才能连接到我,这没问题。
那么,怎么告诉路由器打开一个可以对外连接的端口呢?我想这应该是可以做到的,因为像BitTorrent这样的点对点软件也需要这样做,才能让客户端之间进行通信。
2 个回答
另一个选择是 gRPC 协议。
正如你提到的,你需要在路由器上打开一个特定的端口,并使用这个端口进行通信。由于有很多不同品牌和型号的路由器,我建议你查看你想使用的路由器的说明书。
关于代码,你可以先检查一下你的代码在局域网(LAN)上是否能正常工作,然后看看路由器是否允许你将某些端口列入白名单。网上有很多简单的例子可以参考。
这是我之前玩过的一段代码:
http://www.mediafire.com/download/vef4q4prkr7be2e/python.socket.zip
如果你不想让用户去乱动端口和路由器的设置,我能想到的第一个替代方案是:
你可以设置一个REST API,在一个接口中,用户可以通过提供(聊天房间名称,从时间戳,到时间戳[,可选的聊天房间密码])来获取消息,但这和套接字(sockets)没有关系,你需要使用简单的HTTP请求(urllib/urllib2)。当然,可能会有一些变通的方法,比如使用一个总是被列入白名单的端口(像浏览器的80端口,SSH的22端口),但你需要自己去查找这些例外情况。
请注意,1024以下的端口需要特殊权限(管理员/sudo)才能使用。
附注:在传统的实现中,另一方(客户端)需要知道你的(IP,端口)组合才能连接到你(服务器)。