2009-04-02 10 views
2

これは問題です。 私の主な仕事は、TestRequestHandlerクラスの "handle"メソッドに "s"オブジェクトを渡すことです。 私の最初のステップは、 "ポイント"メソッドを通して "TestServer"クラスに "s"オブジェクトを渡しましたが、ここで止まってしまいました。 "s"オブジェクトをTestRequestHandlerに渡す方法は?いくつかの提案?SocketServer.BaseRequestHandlerのインスタンスにオブジェクトのインスタンスを渡す方法?

import threading 
import SocketServer 
from socket import * 

class TestRequestHandler(SocketServer.BaseRequestHandler): 

    def __init__(self, request, client_address, server): 
     SocketServer.BaseRequestHandler.__init__(self, request, client_address, server) 
     return 

    def setup(self): 
     return SocketServer.BaseRequestHandler.setup(self) 

    def handle(self): 
     data = self.request.recv(1024) 

     if (data): 
      self.request.send(data) 
      print data 

    def finish(self): 
     return SocketServer.BaseRequestHandler.finish(self) 

class TestServer(SocketServer.TCPServer): 

    def __init__(self, server_address, handler_class=TestRequestHandler): 
     print "__init__" 
     SocketServer.TCPServer.__init__(self, server_address, handler_class) 
     return 

    def point(self,obj): 
     self.obj = obj 
     print "point" 

    def server_activate(self): 
     SocketServer.TCPServer.server_activate(self) 
     return 

    def serve_forever(self): 
     print "serve_forever" 
     while True: 
      self.handle_request() 
     return 

    def handle_request(self): 
     return SocketServer.TCPServer.handle_request(self) 

if __name__ == '__main__': 

    s = socket(AF_INET, SOCK_STREAM) 

    address = ('localhost', 6666) 
    server = TestServer(address, TestRequestHandler) 
    server.point(s) 
    t = threading.Thread(target=server.serve_forever()) 
    t.setDaemon(True) 
    t.start() 
+0

私は混乱しています。あなたのサーバはlocalhost:6666上のソケットをオープンしています。あなたが作成している "ポイント"をしようとしているこの他のソケットは何ですか?それはテストのためのクライアントソケットであるはずですか? –

+0

私はちょっと混乱しています。 "提供する"とは、スレッド間通信を指していますか?または、リモートプロシージャコールを作成しようとしていますか?ワイヤでサーバにオブジェクトを送信していますか?私はあなたが "ポイント"を意味するものを理解していないと告白します。 –

答えて

1

sの値を一度設定し、再初期化されていない場合 - TESTSERVERのインスタンス変数とは対照的に、あなたはそれクラス変数作ることができ、その後、ハンドラは中TESTSERVERのクラスメソッドを介してそれを取得していますハンドラのコンストラクタ

例:TestServer._mySocket = S

2

私が正しく理解していれば、私はあなたがおそらくモジュールがどのように機能するかを誤解していると思います。サーバがバインドするためには、すでに 'localhost:6666'というアドレスを指定しています。

serve_forever()を呼び出してサーバーを起動すると、サーバーはlocalhost:6666上のソケットの受信を開始します。

ドキュメントによると、そのソケットはRequestHandlerに 'request'オブジェクトとして渡されます。データがソケットで受信されると、あなたの 'handle'メソッドは、文書化されたソケットAPIを使用してそのオブジェクトとの間でrecv/sendを行うことができます。

さらなる抽象化が必要な場合は、RequestHandlerがStreamRequestHandlerから拡張し、ファイルライクなオブジェクトを使用してソケットに読み書きできるように見えます。

重要なことは、追加のソケットを作成してから、サーバーに新しいソケットを強制的に使用させる必要はないということです。 SocketServerモジュールの価値の一部は、ソケットのライフサイクルを管理することです。

クライアントの観点からサーバーをテストする場合は、クライアントの要求を読み取り/書き込みできるソケットを作成することをお勧めします。しかし、あなたはこのソケットをサーバーに渡すことは決してありません。あなたはおそらくこれを完全に別のプロセスで行い、IPC経由でソケットを介してサーバをテストします。新しい情報

に基づいて

編集は、サーバーAが一つの解決策は、単にあなたのRequestHandler内側からソケットを開くことであるデータを受信したときに、サーバーBにソケットを開くために、サーバーAを取得します。つまり、サービスの要件に基づいて対処する必要がある他の設計上の懸念があります。

たとえば、サーバーAがリソースのように使用できるサーバーBにいくつかのソケットを開くという単純な接続プールを使用することができます。これを手助けするいくつかのライブラリが既にPythonにあるかもしれません。あなたの現在の設計を考える

あなたはこのような何かを行うことができますので、あなたの要請ハンドラは、メンバ変数としてサーバーにアクセスする場合があります:

class TestServer(SocketServer.TCPServer): 
    def point (self, socketB): 
     self.socketB = socketB # hold serverB socket 

class TestRequestHandler(SocketServer.BaseRequestHandler): 

    def handle(self): 
     data = self.request.recv(1024) 

     if (data): 
      self.request.send(data) 
      print data 

     self.server.socketB ... # Do whatever with the socketB 

しかし、私はあなたには、いくつかの並べ替えを持っているため、それは良いかもしれ、言ったようにサーバーBハンドラーが着信要求が処理されるときにソケットを取得または解放できるように、サーバーBソケットを管理する接続プールまたはその他のオブジェクトの名前。

このようにして、サーバーBがソケットを破損している状況をより適切に処理できます。あなたの現在のデザインは非常に簡単に壊れたソケットを処理することはできません。ちょっと考えました...

1

私の主な仕事はこれです。開始時に別のサーバー(B-server-localhost、7777)への「ハード」接続を開くリスニングサーバー(A-server-localhost、6666)の構成。 顧客がAサーバにデータを送信すると、この(Aサーバ)がBサーバにデータを送信し(Bサーバへのハード接続を有する)、BサーバからAサーバに応答を受信し、顧客に 次に、顧客はデータを送信し、Aサーバはデータを受信して​​からBサーバに送信し、Bサーバからデータを受信し、Aサーバはデータを顧客に送信します。 だからラウンドラウンド。 Bサーバーへの接続は、サーバーAが停止する直前に終了します。 これはすべて上記のテストです。

+0

@Ozymet私の回答を改訂しました –

関連する問題