我最近通过互联网将套接字连接到另一台计算机的套接字有一些困难,图像胜过千言万语:
计算机 A 正在运行此" listener.py "脚本:
import socket
PORT = 50007
BUFFER = 2048
HOST = ''
if __name__ == '__main__':
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(BUFFER)
if not data: break
conn.sendall(data)
计算机 B 正在运行此" sender.py "脚本:
import socket
HOST = '101.81.83.169' # The remote host
PORT = 50007 # The same port as used by the server
if __name__ == '__main__':
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
首先,我运行" 监听器"电脑脚本 A 。然后,我运行" 发件人"计算机B的脚本。然而,当我执行" 发件人"脚本,我收到错误消息,该消息向我解释说我无权连接到此远程地址。
所以我想知道如何在不改变路由器配置的情况下通过互联网将套接字连接到另一个套接字。
非常感谢你的帮助。
编辑:此处显示错误消息(由于某些原因,我没有执行相同的脚本,但它的错误消息相同)
sock.connect(('101.81.83.169',50007)) Traceback (most recent call last): File "<stdin>", line 1, in
<module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 224, in
meth return getattr(self._sock,name)(*args) socket.error: [Errno 61] Connection refused
答案 0 :(得分:0)
计算机B无法直接连接到计算机A,因为它具有无法从外部访问的IP地址。您需要在101.81.83.169路由器中设置端口转发规则,该规则将端口50007的传入连接请求重定向到IP地址192.168.0.4。
但是,既然您说您在不改变路由器配置的情况下寻求解决方案,那么您需要一些不同的东西。
在这种情况下,您可以设置在公共Internet上运行的中间服务器,然后两台计算机都可以连接到它们并充当它们之间的中间隧道平台。对此的解决方案已经存在,例如,请查看ngrok,它具有可用的Python绑定。
答案 1 :(得分:0)
从书"Computer Networking: A Top-Down Approach"开始,第149页有关于Bittorents如何运作的一部分非常有趣:
每个torrent都有一个称为跟踪器的基础结构节点。当对等体加入torrent时,它会向跟踪器注册自己,并定期通知跟踪器它仍然在torrent中。以这种方式,跟踪器跟踪参与洪流的对等体。给定的torrent可以在任何时刻参与少于十个或超过一千个对等。 Alice,加入 torrent,跟踪器从参与对等方中随机选择一组对等方(具体而言,比如50),发送这些50的IP地址与爱丽丝同行。 Alice拥有此对等列表,尝试与此列表中的所有对等方建立并发TCP连接。让我们调用Alice成功建立TCP连接的所有对等体“邻居对等。
所以:
- 步骤1 :Alice连接到跟踪器,跟踪器向Alice提供Bob和Mick的IP地址。
- 步骤2 :Alice收到Bob和Mick的IP地址,然后她可以尝试建立TCP / IP连接以下载文件。
当我想从Bittorent下载文件时,我不记得必须设置任何路由器配置。
那么我错过了什么?
答案 2 :(得分:-1)
所以我想知道如何在不改变路由器配置的情况下通过互联网将套接字连接到另一个套接字。
你做不到。公共IP地址属于您的路由器。您的服务器没有在路由器中侦听,它正在侦听路由器后面的某些主机。您必须在路由器中打开该端口并将其转发到您的侦听器运行的主机:无论您的特定路由器是什么意思。否则路由器将拒绝连接,因为它没有任何监听该端口的东西。