Python:简单的WebServer无法从环回以外的其他接口访问?

时间:2015-10-17 13:25:32

标签: python networking webserver

我有一个简单的问题(嗯,至少我希望它很简单)。我已经下载了一个python脚本,它实际上是一个简单的Web服务器。在我输入浏览器127.0.0.1:8080后,浏览器显示一条消息,因为Web服务器知道如何处理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)

2 个答案:

答案 0 :(得分:1)

您命名为HOST_NAME的绑定界面应为“任何地址”,例如

HOST_NAME = '0.0.0.0'

答案 1 :(得分:0)

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'