0

我正在尝试覆盖 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 对象之前我已经注释了服务器对象。我对套接字编程有点陌生,请原谅我的盲目错误。

这是我得到的错误:

custom_server = superTCPHandler((HOST, PORT), superTCPHandler, bytearray([114, 100, 100 ,100, 2]))

TypeError: init () 需要 5 个参数(给定 4 个)
[在 0.1 秒内完成,退出代码为 1]

4

1 回答 1

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()
于 2017-09-05T16:32:19.427 回答