我正在尝试创建一个将在套接字上侦听的 Python 程序。我正在使用带有 Python 2.7 的 Windows 7。无论我做什么,套接字似乎都可以从本地机器访问,但不能从网络上的其他地方访问。
我有以下代码:
from werkzeug.wrappers import Request, Response
@Request.application
def application(request):
return Response('Hello World!')
if __name__ == '__main__':
from werkzeug.serving import run_simple
# Using empty string or the machine's real IP address here
# gives the same problem
run_simple('0.0.0.0', 4000, application)
如果我从本地计算机连接,我会看到响应正常。如果我执行
$ curl 'http://192.168.1.1:4000/'
从网络上的另一个(linux)盒子,卷曲在超时之前挂了很长时间。Wireshark 显示我收到一个到端口 4000 的 SYN 数据包,但没有看到它被确认。
我已经尝试确保允许到此端口的数据包通过防火墙(我在 Wireshark 中看到 SYN 的事实表明这不是问题)。我尝试将 Python 设置为以管理员身份运行(并且我检查过它是否ctypes.windll.shell32.IsUserAnAdmin()
返回 true)。这不仅仅是 Werkzeug,我也尝试过使用 Python 标准库中的 SocketServer。
在同一端口上运行 Windows Apache 可以在整个网络上正常运行,这表明网络或防火墙或我的curl
请求没有问题。
netstat -an
显示:
TCP 0.0.0.0:4000 0.0.0.0:0 LISTENING
编辑:我尝试过使用以下最少的代码。在服务器端(Windows 7):
import socket
s = socket.socket()
s.bind(('', 8080))
s.listen(1)
remotesock, addr = s.accept()
在 linux 客户端上:
import socket
s = socket.socket()
s.connect('192.168.1.1', 8080)
这会挂起直到超时,就像 curl 一样。