在socker服务器构造函数覆盖

时间:2017-09-04 11:27:53

标签: python-2.7 sockets tcp socketserver constructor-overloading

我试图覆盖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]

1 个答案:

答案 0 :(得分:0)

有很多问题:

  • superTCPHandler不是处理程序,因为它是从TCPServer派生的。
  • superTCPHandler中__init_的签名是错误的。
  • custom_server不会实例化派生的TCPServer类。

以下代码派生自定义服务器,该服务器采用额外的有效负载参数。该参数作为服务器实例的成员变量添加。处理程序检索服务器实例的有效负载。

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