Python: 除了环回之外,无法从其他接口访问简单 WebServer?

Python: Simple WebServer not accessible from other interface than loopback?

我有一个简单的问题(好吧,至少我希望它很简单)。我已经下载了一个 python 脚本,它实际上是一个简单的网络服务器。在我输入浏览器 127.0.0.1:8080 后,浏览器显示一条消息,因为网络服务器知道如何处理 GET 请求。我有一个静态 IP,但是,如果我尝试 my.static.ip.address:8080 它不起作用。它无法访问服务器。是ubuntu不让,还是?

无论如何,这是代码:

import time
import BaseHTTPServer


HOST_NAME = 'example.net' # !!!REMEMBER TO CHANGE THIS!!!
PORT_NUMBER = 8080 # Maybe set this to 9000.


class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_HEAD(s):
        s.send_response(200)
        s.send_header("Content-type", "text/html")
        s.end_headers()
    def do_GET(s):
        """Respond to a GET request."""
        s.send_response(200)
        s.send_header("Content-type", "text/html")
        s.end_headers()
        s.wfile.write("<html><head><title>Title goes here.</title></head>")
        s.wfile.write("<body><p>This is a test.</p>")
        # If someone went to "http://something.somewhere.net/foo/bar/",
        # then s.path equals "/foo/bar/".
        s.wfile.write("<p>You accessed path: %s</p>" % s.path)
        s.wfile.write("</body></html>")

if __name__ == '__main__':
    server_class = BaseHTTPServer.HTTPServer
    httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
    print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER)
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass
    httpd.server_close()
    print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)

BaseHTTPServer 继承自 SocketServer.TCPServer。

我们来看看它的构造函数:

class TCPServer(BaseServer):

    def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):
        BaseServer.__init__(self, server_address, RequestHandlerClass)
        self.socket = socket.socket(self.address_family, self.socket_type)
        if bind_and_activate:
            try:
                self.server_bind()
                self.server_activate()
            except:
                self.server_close()
                raise

好的,现在让我们看看这个 server_bind() 方法:

def server_bind(self):
    if self.allow_reuse_address:
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.socket.bind(self.server_address)
    self.server_address = self.socket.getsockname()

因此,您已将 HTTP 服务器的底层套接字绑定到端口 8080 上的主机 'example.net'。这意味着您的服务器未绑定到 IP 地址 my.static.ip.address。

尝试改为: HOST_NAME = 'my.static.ip.address'

您命名为 HOST_NAME 的绑定接口应该是 'any address' 例如

HOST_NAME = '0.0.0.0'