2016-01-18 3 views
1

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

Оригинального файл

import SocketServer 

class MyTCPHandler(SocketServer.BaseRequestHandler): 
    def handle(self): 
     self.data = self.request.recv(1024).strip() 
     print self.data 

if __name__ == "__main__": 
    HOST, PORT = "192.168.65.1", 5001 
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 
    server.serve_forever() 

Моего файл:

import SocketServer 

class MyTCPHandler(SocketServer.BaseRequestHandler): 

    def __init__(self): 
     self._running = True 

    def terminate(self): 
     self._running = False 

    def setup(self): 
     print('{}:{} connected'.format(*self.client_address)) 

    def handle(self): 
     self.data = self.request.recv(1024).strip() 
     print self.data 

    def finish(self): 
     print('{}:{} disconnected'.format(*self.client_address)) 

#if __name__ == "__main__": 
    def run(self): 
     HOST, PORT = "192.168.65.1", 5001 
     server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 
     server.serve_forever() 

я запускаю его как отдельный поток в моем основной файл с использованием

Thread(target=MyTCPHandler().run, args=()).start() 

Однако, когда я бегу главный питона файл я получил эту ошибку

---------------------------------------- 
Exception happened during processing of request from ('192.168.65.1', 37997) 
---------------------------------------- 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock 
    self.process_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 321, in process_request 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
TypeError: __init__() takes exactly 1 argument (4 given) 

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

ответ

1

Проблема заключается в том, что вы передаете неправильное количество параметров методу родителя здесь SocketServer.BaseRequestHandler.

Подробнее о kargs и inheritance и вы поймете проблему. Короче говоря, kargs может принимать переменное количество аргументов.

Надеюсь, это поможет. Изменение

def __init__(self): 
    self._running = True 

в

def __init__(self, *kargs): 
    SocketServer.BaseRequestHandler.__init__(self, *kargs) 
    self._running = True 
+0

Спасибо Проблема решена – Akoudz

Смежные вопросы