python bottle can run two programs on the same address and port on WINDOWS
Asked Answered
Z

1

4

I just encountered a weird issue about bottle on windows. When I tested the my bottle codes, I found that it could run multiple same programs on WINDOWS using same address and port. But when you try to start multiple same program on the Linux or Mac using same address and port, it will report the below error:

socket.error: [Errno 48] Address already in use 

my bottle codes are:

from bottle import route, run, template

@route('/hello/:name')
def index(name='World'):
    return template('<b>Hello {{name}} </b>', name=name)

run(host='localhost', port=9999)

Then I traced the code, from bottle to wsgiref, and finnaly found that the problem might be in the Python27\Lib\BaseHTTPServer.py. I mean when I use the the below simple codes:

import BaseHTTPServer

def run(server_class=BaseHTTPServer.HTTPServer,
        handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
    server_address = ('localhost', 9999)
    print "start server on localhost 9999"
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()

run()

The same issue would happen on windows.

But if I directly used the socketserver, like the below codes:

import SocketServer

class MyTCPHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print "{} wrote:".format(self.client_address[0])
        print self.data
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    print "Start a server on localhost:9999"
    # Create the server, binding to localhost on port 9999
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()

The same issue will not happen, I mean even on window the above socketserver codes will report the error, when you try to start another programe.

socket.error: [Errno 48] Address already in use

All my tests used the Python 2.7, Windows 7 and Centos 5.

So my questions are why the HTTPServer will have this issue on windows? And how can I let my bottle programe will report the same error on windows, just like on windows?

Zildjian answered 11/6, 2013 at 13:9 Comment(0)
Z
2

Sorry to bother all.

I've found the resolution, just so simple. Simply change the BaseHTTPServer.HTTPServer's attribute allow_reuse_address to 0.

The codes should be:

from bottle import route, run, template
import BaseHTTPServer

@route('/hello/:name')
def index(name='World'):
    return template('<b>Hello {{name}} </b>', name=name)

setattr(BaseHTTPServer.HTTPServer,'allow_reuse_address',0)
run(host='localhost', port=9999)
Zildjian answered 11/6, 2013 at 14:45 Comment(1)
For so many years I've taken for granted that a port can only be bound to a single process. Now I realize I'm wrong. The below Q&A could be a quick reference for guys interested.Teucer

© 2022 - 2024 — McMap. All rights reserved.