简体   繁体   English

从单独的线程运行的Python ServerSocket

[英]Python ServerSocket running from a separate Thread

I want to run a Python serversocket class in a separate thread. 我想在单独的线程中运行Python serversocket类。 For that I have modified this code to support python threading: 为此,我修改了此代码以支持python线程:

Original file 原始文件

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

To My file: 到我的文件:

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

I run it as a separate thread in my main file using 我使用以下命令在主文件中将其作为单独的线程运行

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

However, when I run the main python file I got this error 但是,当我运行主python文件时,出现此错误

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

First, Is my modification to support threading is correct? 首先,我对支持线程的修改是否正确? Please, Can anybody give me a favor? 拜托,有人可以帮我一个忙吗?

The problem here is that you are passing incorrect number of parameters to the Parent method here the SocketServer.BaseRequestHandler. 这里的问题是您在SocketServer.BaseRequestHandler此处将不正确数量的参数传递给Parent方法。

Read about kargs and inheritance and you will understand the problem. 阅读有关参数继承的信息 ,您将了解问题。 In short kargs can take variable number of arguments. 简而言之,参数可以使用可变数量的参数。

Hope it helps. 希望能帮助到你。 Change 更改

def __init__(self):
    self._running = True 

to

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

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

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