繁体   English   中英

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

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

我有一个简单的问题(好吧,希望它很简单)。 我下载了一个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)

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

HOST_NAME = '0.0.0.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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM