2

NetstringReceiverプロトコルの子を実装したサーバーがあります。クライアントの要求に基づいて(txredisapiを使用して)非同期操作を実行し、操作の結果で応答するようにします。私のコードの一般化:

class MyProtocol(NetstringReceiver):
  def stringReceived(self, request):
    d = async_function_that_returns_deferred(request)
    d.addCallback(self.respond)
    # self.sendString(myString)

  def respond(self, result_of_async_function):
    self.sendString(result_of_async_function)

上記のコードでは、サーバーに接続しているクライアントは応答を受け取りません。ただし、コメントを外すとmyStringが取得されます

# self.sendString(myString)

また、result_of_async_functionはstdoutに出力するため、空ではない文字列であることも知っています。

非同期関数の結果でクライアントに応答できるようにするにはどうすればよいですか?

更新:実行可能なソースコード

from twisted.internet import reactor, defer, protocol
from twisted.protocols.basic import NetstringReceiver
from twisted.internet.task import deferLater

def f():
  return "RESPONSE"

class MyProtocol(NetstringReceiver):
  def stringReceived(self, _):
    d = deferLater(reactor, 5, f)
    d.addCallback(self.reply)
    # self.sendString(str(f())) # Note that this DOES send the string.

  def reply(self, response):
    self.sendString(str(response)) # Why does this not send the string and how to fix?

class MyFactory(protocol.ServerFactory):
  protocol = MyProtocol

def main():
  factory = MyFactory()
  from twisted.internet import reactor
  port = reactor.listenTCP(8888, factory, )
  print 'Serving on %s' % port.getHost()
  reactor.run()

if __name__ == "__main__":
  main()
4

2 に答える 2

2

について 1 つの特定の機能がありますNetstringReceiver

不正なメッセージを受信すると接続が失われます

メッセージが djb の Netstring プロトコルに準拠していることは確かですか?

明らかに、クライアントは解析できなかった不正な文字列を送信し、プロトコル条件によって接続が失われます。それ以外はすべてコード内で適切に表示されます

その特定のプロトコルが必要ない場合は、LineReceiver代わりに継承することをお勧めしますNetstringReceiver

于 2012-08-13T20:18:09.773 に答える
0

応答が得られない理由は、送信されるまでに接続が閉じられているためです。接続が閉じられる理由は、'nc' で送信するメッセージが次のとおりで
1:a,\n
あるためです: nc にメッセージを送信させるには改行を入力する必要がありますが、nc はそれをメッセージの一部として含めます。これは NetString プロトコルに違反しています... 代わりに次のメッセージを送信することで (コードをいくつか追加で変更して) 回避しまし
1:a,40:\n blahblahblahた。
8:RESPONSE,

于 2014-07-25T22:24:32.980 に答える