la bouteille de python peut exécuter deux programmes sur la même adresse et le même port sur WINDOWS

Je viens de rencontrer un problème étrange au sujet de la bouteille sur les fenêtres. Lorsque j’ai testé les codes de ma bouteille, j’ai constaté qu’il pouvait exécuter plusieurs programmes identiques sur WINDOWS en utilisant la même adresse et le même port. Mais lorsque vous essayez de démarrer plusieurs programmes identiques sur Linux ou Mac en utilisant la même adresse et le même port, l’erreur suivante sera signalée:

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

mes codes de bouteille sont:

 from bottle import route, run, template @route('/hello/:name') def index(name='World'): return template('Hello {{name}} ', name=name) run(host='localhost', port=9999) 

Ensuite, j’ai tracé le code, de la bouteille à wsgiref, et finalement trouvé que le problème pouvait être dans le Python27 \ Lib \ BaseHTTPServer.py. Je veux dire quand j’utilise les codes simples ci-dessous:

 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() 

Le même problème se produirait sur Windows.

Mais si j’ai directement utilisé le socketserver, comme les codes ci-dessous:

 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).ssortingp() 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() 

Le même problème ne se produira pas, je veux dire, même sur la fenêtre, les codes de socketserver ci-dessus signaleront l’erreur, lorsque vous essayez de démarrer un autre programme.

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

Tous mes tests ont utilisé Python 2.7, Windows 7 et Centos 5.

Donc, mes questions sont pourquoi le HTTPServer aura ce problème sur Windows? Et comment puis-je laisser mon programme de bouteilles signaler la même erreur sur Windows, comme sur Windows?

Désolé de déranger tout.

J’ai trouvé la résolution, tellement simple. Modifiez simplement l’atsortingbut Allow_reuse_address de BaseHTTPServer.HTTPServer sur 0.

Les codes doivent être:

 from bottle import route, run, template import BaseHTTPServer @route('/hello/:name') def index(name='World'): return template('Hello {{name}} ', name=name) setattr(BaseHTTPServer.HTTPServer,'allow_reuse_address',0) run(host='localhost', port=9999)