0

私は、ハンドラ関数に変数を渡すことができるようにTCPHandlerクラスのコンストラクタをオーバーライドしようとしています。私に。私はhandle()メソッドのsendall関数にバイト配列を渡さなければなりません。そして、上記を行うためのさまざまなアプローチを見て、コンストラクタをオーバーライドするのが最も優先されたオプションでした。私はhelp(superTCPHandler))を印刷するとき ザ・は、handle()関数はその継承を示していない、5つの引数がsockerサーバーのコンストラクタオーバーライドで4つ与えられる

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

私のコードでコードがコンパイルされますが、何もしない、またはクライアントが何も受信しません。私はhandle()関数が私のカスタムクラスから呼び出されていないと仮定しています。私は間違いが__init__の部分にあるという強い感情を持っています。私は、異なるアプローチで何度も試してみましたが、うまくいかなかったのです。これを行う正しい方法は何ですか?

基本クラス(MyTCPHandler)のオブジェクトを作成する必要があるかどうかわからないため、custom_serverオブジェクトを初期化する前にサーバーオブジェクトにコメントしました。私はちょっとソケットプログラミングに新しいです、私の盲目の間違いのために私を許してください。

これは私が取得エラーです:

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

多くの問題がありました:

  • 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() 
関連する問題