我有一个服务器,我已经实现了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()
答案 0 :(得分:2)
NetstringReceiver
有一个特定的功能:
如果收到非法消息,则连接丢失
您确定自己的邮件符合djb's Netstring protocol吗?
显然,客户端发送无法解析的非法字符串,并且协议条件会丢失连接。 其他所有内容在您的代码中看起来都很好。
如果你不需要那个特定的protcol,你最好继承LineReceiver
而不是NetstringReceiver
。
答案 1 :(得分:0)
您从未收到回复的原因是,在发送连接时,连接已关闭。关闭连接的原因是您发送的消息' nc'是:
1:a,\n
因为您必须键入换行符才能让nc发送消息,但是nc将其作为消息的一部分包含在内。这违反了NetString协议......
我通过发送此消息来解决它(使用一些额外的打印修改代码):
1:a,40:\n
blahblahblah
请点击此处返回,只需等待回复
8:RESPONSE,