次の操作を順番に実行する必要がある単純な TCP サーバーをツイストで作成しようとしています。
- クライアントがサーバーに接続し、
KEEPALIVE
この接続のフラグが 1 に設定されます。 - サーバーはクライアントからデータを受け取ります。
- 次に、リストである応答を計算します。
- 次に、サーバーはリストの各項目を 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
この例外の理由は理解しています。非ブロッキング ソケットでブロッキング メソッドを呼び出そうとしています。
この問題の解決策を見つけるのを手伝ってください。