ip = '12.34.56.789' #不是我真实的IP地址,它是我从whatismyip.org获得的
第一个问题是“12.34.56.789”根本不是有效的 IP 地址。每个组件必须适合 8 位 (0-255); 789 不可能。但我假设这不是您正在运行的实际代码,因为输出显示 12.45.29.122。
第二个问题是您使用的地址不是您的真实地址。
您的机器可能有一个内部 IP 地址,只能从您的 LAN 访问。那么,你的router有一个外部IP地址。路由器使用一种称为网络地址转换的技术,让 LAN 上的每台计算机在充当客户端时假装外部地址属于它们(这就是为什么 Whatismyip.org 向您显示该地址)。但当它们充当服务器时,这就不起作用了。
仔细想想,确实没有办法。如果您建立出站连接,并且有人回复,路由器知道回复应该发送到您的计算机。但是,如果有人突然出现并与路由器对话,它怎么知道将连接发送到哪台机器呢?
如果您尝试从同一 LAN 内部进行连接,有一个非常简单的解决方案:使用服务器的真实内部地址,而不是路由器的外部地址。
如果您需要从外部进行连接,则无需做一些额外的工作。有四种方法可以解决这个问题:
为您的机器提供一个真实的可公开寻址的 IP 地址(例如,将其放在路由器的 DMZ 上)。对于家庭用户来说,这通常不是一个选择,对于那些不知道自己在做什么的人来说,这是一个糟糕的选择(除非你希望你的机器在午餐时间成为某人僵尸网络的一部分)。
在路由器配置中设置静态端口转发。这对于每个路由器来说都是不同的,但想法是你告诉它“如果有人来寻找端口 9001,总是将他们发送到机器 192.168.1.64”。
使用 UPnP 动态设置端口转发。
设置 NAT 打洞。
选项3和4更复杂,我认为选项2就是你想要的,所以我不会解释它们。
最重要的是:
HOST, PORT = "192.168.1.64", 9001
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
您已明确告诉服务器“监听 192.168.1.64”。即使您将服务器计算机放在 DMZ 上,因此它的地址为 192.168.1.64 和 12.45.29.122,您的程序也仅侦听第一个地址上的连接,因此没有人能够使用第二个地址访问它。如果您想监听所有地址,请使用 0.0.0.0。
在编辑后的版本中,您现在正在侦听 0.0.0.0,并连接到路由器的公共 IP,并且您声称已在路由器上设置了端口转发,但您仍然收到完全相同的错误。
如果这一切都是正确的,那么存在三个明显的问题可能会出现问题:
- 你实际上并不是端口转发;而是端口转发。设置有问题。
- 您实际上并没有在 0.0.0.0:9001 上收听。
- 您的防火墙阻止了连接。
您可以进行一些测试来缩小范围。
打开两个终端。在其中之一中,输入nc -kl 9001
。在另一个中,输入nc 12.34.56.78 9001
。它们应该连接起来,因此您在一个窗口中输入的任何内容都会出现在另一个窗口中(可能仅在您按回车键后)。如果有效,则端口转发正常工作,并且不存在防火墙问题,因此这是您的代码中的问题。
如果这不起作用,请准确发布您在每个窗口中看到的内容。然后按 Ctrl-C 第二个nc
,然后输入nc 192.168.1.64 9001
。如果现在有效,则端口转发设置不正确,除非您有一个聪明的防火墙,允许同一主机(或同一接口)连接但不允许远程连接。
如果两者都不起作用,则可能是防火墙问题。 (除非您的 IP 地址或其他信息有误。)您可能可以在某个地方找到日志,但如果不知道您所在的平台以及您使用的防火墙,就很难提供太多帮助。 (另外,这可能是与 SO 不同的网站的问题。)
如果您使用的是 Windows 或某些 Linux 发行版,则需要获取以下副本nc
(netcat) 来自某处;在大多数 Linux 发行版和 Mac 上,它应该是内置的。此外,GNU、BSD 和 Hobbitnc
略有不同,所以如果nc -kl 6000
给你一个错误,你可能需要阅读手册页或--help
。 (如果我没记错的话,霍比特人nc
需要-l -p6000
, BSD 要求-l 6000
,GNU 允许其中之一。)
或者你可能想要ncat,netcat 的重新实现,我知道它可以处理我上面使用的语法,并且有一个适用于 Windows 的单文件静态可执行文件。
如果您无法开始nc
,至少尝试更改代码以连接到 192.168.1.64 而不是 12.34.56.78。如果这解决了问题,至少您会知道它是端口转发或允许同一主机/接口连接但不允许远程连接的防火墙。