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

关于 有一个特定的功能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 回答