【问题标题】:Python Sockets: Connection TimeoutPython 套接字:连接超时
【发布时间】:2016-02-14 16:12:03
【问题描述】:

我正在尝试编写两个简短的 python 脚本,将两台或多台机器相互连接,一台作为服务器,另一台作为客户端。在同一台计算机上测试客户端和服务器脚本时效果很好,但是当我从另一台计算机上尝试时,客户端一直超时;它无法连接到服务器。这是我的服务器代码:

import socket
server = socket.socket()
host = "computername"
port = 12345
server.bind((host, port))
server.listen(5)

client, addr = server.accept()

客户端代码:

import socket
server = socket.socket()
host = "computername"
port = 12345
server.connect((host, port))

任何关于为什么机器无法连接的线索?

【问题讨论】:

  • 您是否尝试过禁用防火墙(在两台计算机上)?服务器上有public ip 吗?如果您将python3 -mhttp.server --bind computername 12345 作为服务器运行而python3 -c "from urllib.request import urlopen; print(urlopen('http://computer:12345').read().decode())" 作为客户端运行会发生什么?
  • @J.F. Sebastian 该代码是如何工作的?我不明白该怎么处理它。
  • 将这些命令复制粘贴到相应计算机(首先是 http 服务器,然后是发出请求的客户端)上的命令行(终端、控制台)中。目的是找出问题是您的代码还是网络。如果请求成功,那么问题就是您的代码。如果请求失败,那么问题与您的 Python 代码无关,您应该先配置网络。
  • 我从客户端收到一条错误消息,提示“没有名为 request 的模块”,而来自服务器的“没有名为 http 的模块”。
  • 这意味着您使用 Python 2(edit 您的问题并提到您使用 Python 2)。注意python3(我建议的命令末尾有3)。在 Python 2 上,您可以运行:python2 -mSimpleHTTPServer 12345 作为服务器,python2 -c "from urllib2 import urlopen; print urlopen('http://computername:12345').read()" 作为客户端。

标签: python sockets timeout serversocket


【解决方案1】:

我认为,在不同机器上运行客户端和服务器脚本时,您正在正确更改主机变量。尝试通过正确更改/或使用服务器机器的 IP 地址来尝试。

【讨论】:

  • 不,宿主变量是一样的;这是我电脑的名字。我会尝试使用 IP 地址。
【解决方案2】:

通信可能被防火墙禁止。

要排除与 DNS 相关的问题,请尝试使用 IP 而不是主机名:

# server: listen on all interfaces
server.bind(('', port))

和:

# client: specify server's IP address
server.connect(("192.168.XX.YY", port))

当然是真实的 IP 地址。

【讨论】:

  • 使用 IP 地址并没有“解决”问题。我还在超时。我会尝试其他一些事情,比如验证 IP 地址,但此时我无能为力。我的代码应该可以工作,对吧?
  • @I.A.S.在这种情况下,最可能的解释是服务器上的防火墙。
  • 它是防火墙的一个特定部分还是全部?
  • 我禁用了防火墙,但连接仍然超时。这与客户是 Macbook 有关吗?我有点绝望了。
  • 很难猜测远程网络上发生了什么。我会阅读日志并可能使用 tcpdump 来查看 tcp 端口 12345 上的流量。但这是题外话。我在您的代码中没有看到任何错误,但是只显示了连接建立部分。
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 2012-11-17
  • 2011-02-05
  • 2018-11-26
  • 2020-06-02
  • 2016-10-02
相关资源
最近更新 更多