Skip to main content
 首页 » 编程设计

Python 没有监听我指定的任何端口

2025年05月04日30think

我正在执行 simple Python socket tutorial.我使用初始化套接字

import socket 
import sys 
# Create a TCP/IP socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
# Bind the socket to the port 
server = socket.gethostname() 
port = 8080 
server_address = (server,port) 
sock.listen(1) 

但是当我使用 netstat -ntulp 检查我的 Ubuntu 机器正在监听的端口时,我得到了

... 
tcp    0   0 0.0.0.0:49064     0.0.0.0:*        LISTEN   12505/python  
... 

它正在监听端口 49604 而不是端口 8080!请注意,我已经尝试过从 4242 到 47806 的许多不同端口;未使用的随机端口。

为什么我的程序没有监听我定义的端口?

请您参考如下方法:

实际的绑定(bind)部分只出现在您的评论中,而不是您的代码中。调用bind :

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
port = 8080 
sock.bind(('', port)) # actually bind 
sock.listen(1) 

请注意,我更改了地址。如果你想从任何地方都可以访问,像这里一样传递一个空字符串。如果您只想从本地主机访问,请传入 'localhost'(顺便说一下,对于您真正应该使用的 IPv6 套接字,传入 ::1)。

由于多种原因,传递机器名称是错误的;因为机器名被解释为 DNS 名称。可能会出现许多错误或问题:

  • 在最好的情况下,/etc/hosts 中有一个条目与 localhost 匹配。按照规范,对于 IPv4,此条目为 127.0.0.1。
  • 稍微糟糕的情况是当您的代码在类似 debian 的系统上运行时,主机名解析为 127.0.1.1。现在可以在该 IP 下访问您的服务,但不能访问 127.0.0.1。
  • 如果机器名称不在 /etc/hosts 中(这种情况经常发生在更改不完整的情况下,并且某些系统以这种方式设置,例如 chrooted onces),您将触发DNS 解析,希望在本地网络中。在最好的情况下,您会得到一个结果,您现在可以在计算机的网络 IP 地址下访问本地网络中的每个人(如果您有多个 IP 地址,则可以随机选择)。您的服务将不可用于联系本地主机的应用程序。
  • 更糟糕的是,无论出于何种原因,名称解析都可能失败。
  • 更糟糕的是,名称解析可能成功,但实际上并没有返回您机器的 IP 地址,或者返回您机器的未路由地址。这将彻底失败,或者您将监听一个不再使用的地址,因此您的服务基本上无法访问。
  • 更糟糕的是,您的查询可能会泄露到 Internet,这可能会让某些人强制您的服务向全世界开放。

在最好的情况下,绑定(bind)到您的主机名将彻底失败。在最坏的情况下,它可能仅凭运气在某些应用程序上工作,但在许多其他机器上却失败了。绑定(bind)到'localhost'、'',或者让用户配置IP;取决于您是希望您的服务仅对本地机器、所有人还是用户配置的子集可用。