Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将插座连接到另一台计算机';通过Internet访问socket_Python_Sockets_Networking - Fatal编程技术网

Python 如何将插座连接到另一台计算机';通过Internet访问socket

Python 如何将插座连接到另一台计算机';通过Internet访问socket,python,sockets,networking,Python,Sockets,Networking,我最近在通过互联网将一个插座连接到另一台计算机的插座时遇到了一些困难,一张图片抵得上千言万语: 计算机A正在运行此“listener.py”脚本: 计算机B正在运行此“sender.py”脚本: 因此,首先,我运行计算机A的“侦听器”脚本。然后,我运行计算机B的“发送者”脚本。但是,当我执行“发送者”脚本时,我收到一条错误消息,说明我无权连接到此远程地址 因此,我想知道如何在不改变路由器配置的情况下,通过internet将一个套接字连接到另一个套接字 非常感谢你的帮助 编辑:这里是错误消息(由

我最近在通过互联网将一个插座连接到另一台计算机的插座时遇到了一些困难,一张图片抵得上千言万语:

计算机A正在运行此“listener.py”脚本:

计算机B正在运行此“sender.py”脚本:

因此,首先,我运行计算机A的“侦听器”脚本。然后,我运行计算机B的“发送者”脚本。但是,当我执行“发送者”脚本时,我收到一条错误消息,说明我无权连接到此远程地址

因此,我想知道如何在不改变路由器配置的情况下,通过internet将一个套接字连接到另一个套接字

非常感谢你的帮助

编辑:这里是错误消息(由于某些原因,我没有执行相同的脚本,但它是相同的错误消息)

sock.connect(('101.81.83.169',50007))回溯(最后一次调用):文件“”,第1行,在
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py”,第224行,在
meth return getattr(self._sock,name)(*args)socket.error:[Errno 61]连接被拒绝

计算机B无法直接连接到计算机A,因为它的IP地址无法从外部访问。您需要在101.81.83.169路由器中设置端口转发规则,将端口50007的传入连接请求重定向到IP地址192.168.0.4

然而,既然你说你正在寻找一个不改变路由器配置的解决方案,你就需要一些不同的东西


在这种情况下,您可以设置一个运行在公共Internet上的中间服务器,然后两台计算机都可以连接到该服务器,并充当它们之间的中间隧道平台。这方面的解决方案已经存在,例如,请看一看,它有可用的Python绑定。

计算机B无法直接连接到计算机a,因为它有一个从外部无法访问的IP地址。您需要在101.81.83.169路由器中设置端口转发规则,将端口50007的传入连接请求重定向到IP地址192.168.0.4

然而,既然你说你正在寻找一个不改变路由器配置的解决方案,你就需要一些不同的东西

在这种情况下,您可以设置一个运行在公共Internet上的中间服务器,然后两台计算机都可以连接到该服务器,并充当它们之间的中间隧道平台。这方面的解决方案已经存在,例如,请看一看,它有可用的Python绑定

因此,我想知道如何在不改变路由器配置的情况下,通过internet将一个套接字连接到另一个套接字

你不能。公用IP地址属于您的路由器。您的服务器没有在路由器中侦听,它正在路由器后面的某个主机中侦听。您必须在路由器中打开该端口,并将其转发到您的侦听器正在运行的主机:无论这在您的特定路由器中意味着什么。否则,路由器将拒绝连接,因为它在该端口没有任何侦听内容

因此,我想知道如何在不改变路由器配置的情况下,通过internet将一个套接字连接到另一个套接字

你不能。公用IP地址属于您的路由器。您的服务器没有在路由器中侦听,它正在路由器后面的某个主机中侦听。您必须在路由器中打开该端口,并将其转发到您的侦听器正在运行的主机:无论这在您的特定路由器中意味着什么。否则,路由器将拒绝连接,因为它在该端口没有任何侦听功能。

从书中,第149页有一个关于Bittorents如何工作的部分非常有趣:

每个torrent都有一个称为跟踪器的基础结构节点。当对等方加入torrent时,它会向跟踪器注册自己,并定期通知跟踪器它仍在torrent中。通过这种方式,跟踪器跟踪参与torrent的对等方。一个给定的torrent在任何时刻都可能有少于十个或超过一千个节点参与Alice,加入torrent,跟踪器从参与的对等点集中随机选择一个子集(具体来说,比如50个),然后将这50个对等点的IP地址发送给Alice。拥有此对等点列表后,Alice尝试与此列表中的所有对等点建立并发TCP连接。让我们将Alice成功建立TCP连接的所有对等点称为“相邻对等点”

因此:

-步骤1:Alice连接到跟踪器,跟踪器向Alice提供Bob和Mick的ip地址

-步骤2:Alice收到Bob和Mick的ip地址,然后她可以尝试建立TCP/ip连接以下载文件

我不记得当我想从Bittorent下载文件时必须设置任何路由器配置

那么我遗漏了什么呢?

从这本书中,第149页有一个关于Bittorents如何工作的部分非常有趣:

每个torrent都有一个称为跟踪器的基础结构节点。当对等方加入torrent时,它会向跟踪器注册自己,并定期通知跟踪器它仍在torrent中。通过这种方式,跟踪器会跟踪参与torrent的对等方。给定的torrent可能少于10个或多于1000个和随时参与的对等点。Alice,加入torrent,跟踪器从参与的对等点集中随机选择一个子集(具体来说,比如50个),并发送
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)
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')
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