我试图覆盖TCPHandler类的构造函数,以便我可以将变量传递给处理函数,我在堆栈上遇到了其他帖子,但它们对我来说并不清楚。我必须将一个字节数组传递给handle()
方法中的sendall函数,并且在查找执行上述操作的不同方法时,重写构造函数是最常用的选项。
这是我的代码,
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
"""
:file: TCP Handler
:author: Prat, Warsaw, PL
"""
def handle(self):
self.data = self.request.recv(1024).strip()
print "{} Sent: {}".format(self.client_address[0], self.data[0:3])
self.request.sendall(bytearray(self.payload_))
server.server_close()
class superTCPHandler(SocketServer.TCPServer):
def __init__(self,request, client_address, server, payload_):
self.payload_ = (payload_)
SocketServer.TCPServer.__init__(self,request, client_address, BaseRequestHandler, payload_)
def handle(self):
self.data = self.request.recv(1024).strip()
print "{} Sent: {}".format(self.client_address[0], self.data[0:3])
self.request.sendall(self.payload_)
print self.payload_
server.server_close()
if __name__ == "__main__":
print (help(superTCPHandler ))
HOST, PORT = "192.168.4.4", 12345
#server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
custom_server = SocketServer.TCPServer((HOST, PORT), superTCPHandler, bytearray([114, 100, 100 ,100, 2]))
print "Listening on {}:{}".format(HOST, PORT)
custom_server.handle_request()
当我打印出help(superTCPHandler))
时,handle()
函数没有显示其继承,代码编译但什么都不做,或者客户端什么都没有收到。我假设handle()
函数不是从我的自定义类调用的。我确实有一种强烈的感觉,错误在__init__
部分的某个地方,我尝试了多次不同的方法,但没有成功。这样做的正确方法是什么?
我不确定是否必须创建基本类的对象(MyTCPHandler),因此我在初始化custom_server对象之前已经注释了服务器对象。我对socket编程有点新意,请原谅我的盲目错误。
这是我得到的错误:
custom_server = superTCPHandler((HOST, PORT), superTCPHandler, bytearray([114, 100, 100 ,100, 2]))
TypeError: __init__() takes exactly 5 arguments (4 given)
[Finished in 0.1s with exit code 1]
答案 0 :(得分:0)
有很多问题:
以下代码派生自定义服务器,该服务器采用额外的有效负载参数。该参数作为服务器实例的成员变量添加。处理程序检索服务器实例的有效负载。
#!python2
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print "{} Sent: {}".format(self.client_address[0], self.data[0:3])
self.request.sendall(bytearray(self.server.payload_))
class superTCPServer(SocketServer.TCPServer):
def __init__(self, server_address, RequestHandlerClass, payload_, bind_and_activate=True):
self.payload_ = payload_
SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate)
if __name__ == "__main__":
HOST,PORT = '',12345
custom_server = superTCPServer((HOST, PORT), MyTCPHandler, bytearray([114, 100, 100 ,100, 2]))
print "Listening on {}:{}".format(HOST, PORT)
custom_server.handle_request()