Python socketserver, как получить собственный номер порта tcp

Мне нужно использовать socketserver для построения tcp-сервера. Согласно их документу, мне нужно наследовать класс TCPServer и передать ему подкласс класса BaseRequestHandler, где я переписываю метод handle ().

Прямо сейчас мне нужно построить два сервера на другом порту, есть ли способ, который используется в функции handle () (в противном случае мне нужно настроить два почти одинаковых класса обработчика, чего я не хочу), я могу получить свой собственный номер порта?

Не делайте этого в методе handle() , передайте номер порта (из этого https://docs.python.org/2/library/socketserver.html#socketserver-tcpserver-example ):

 #!/usr/bin/env python import SocketServer, argparse class MyTCPHandler(SocketServer.BaseRequestHandler): """ The RequestHandler class for our server. It is instantiated once per connection to the server, and must override the handle() method to implement communication to the client. """ def handle(self): # self.server.server_address is a tuple (IP, port) the server is listening on (host, port) = self.server.server_address print 'port # is: {}'.format(port) # 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__": parser = argparse.ArgumentParser() parser.add_argument('-p', '--port', required=True, help='the TCP port to listen on') args = parser.parse_args() HOST, PORT = "localhost", int(args.port) # 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() 

В этом примере вы должны указать номер порта в качестве аргумента при запуске программы, используя ключ командной строки -p .

Я только выяснил, что решение может иметь право на участие, но оно все еще не очень хорошо, так как мне все еще нужно изменить два порта в коде, чтобы сделать эту работу:

 import socket import threading import SocketServer class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): port = None def handle(self): while True: data = self.request.recv(1024) if not data: break print self.port,data class ThreadedTCPRequestHandler1(ThreadedTCPRequestHandler): port = 9999 class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): pass if __name__ == "__main__": HOST, PORT = "localhost", 9999 server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler1) ip, port = server.server_address server_thread = threading.Thread(target=server.serve_forever) server_thread.daemon = True server_thread.start() #print "Server loop running in thread:", server_thread.name try: while True: continue finally: print 'quitting server' server.shutdown() server.server_close()