-1

次の操作を順番に実行する必要がある単純な TCP サーバーをツイストで作成しようとしています。

  1. クライアントがサーバーに接続し、KEEPALIVEこの接続のフラグが 1 に設定されます。
  2. サーバーはクライアントからデータを受け取ります。
  3. 次に、リストである応答を計算します。
  4. 次に、サーバーはリストの各項目を 1 つずつ送信し、その間にクライアントからの明示的な ACK を待ちます。つまり、リストから 1 つの項目を送信した後、サーバーはクライアントからの ACK パケットを待ち、ACK を受信した後でのみ待ちます。残りのアイテムも同じ方法で送信しますか。

コードは次のとおりです。

class MyFactory(ServerFactory):
    protocol = MyProtocol

    def __init__(self, service):
        self.service = service

class MyProtocol(Protocol):

    def connectionMade(self):
         try:
             self.transport.setTcpKeepAlive(1)
         except AttributeError: 
             pass
         self.deferred = Deferred()
         self.deferred.addCallback(self.factory.service.compute_response)
         self.deferred.addCallback(self.send_response)

    def dataReceived(self, data):
         self.fire(data)

    def fire(self, data):
        if self.deferred is not None:
            d, self.deferred = self.deferred, None
            d.callback(data)

    def send_response(self, data):
        for item in data:
            d = Deferred()
            d.addCallback(self.transport.write)
            d.addCallback(self.wait_for_ack)
            d.callback(item)
        return   

    def wait_for_ack(self, dummy):
        try:
            self.transport.socket.recv(1024)
        except socket.error as e:
            print e
        return

サーバーとクライアントを実行すると、次の例外が発生します。

Resource temporarily unavailable

この例外の理由は理解しています。非ブロッキング ソケットでブロッキング メソッドを呼び出そうとしています。

この問題の解決策を見つけるのを手伝ってください。

4

1 に答える 1