Twisted - Line Receiver sendLine的成功(或失败)回调

时间:2014-01-29 00:55:35

标签: twisted twisted.internet

在完成使用它的应用程序中时,我仍在努力掌握Twisted。

我的问题是:

我的应用程序使用LineReceiver.sendLine从Twisted TCP服务器发送消息。 我想知道sendLine是否成功。

我认为我需要以某种方式为sendLine添加成功(和错误?)回调,但我不知道如何做到这一点。

感谢任何指针/示例

1 个答案:

答案 0 :(得分:3)

您需要定义“成功”才能得出答案。

所有sendLine立即执行 (可能)将一些字节添加到发送缓冲区。在某种意义上,只要它不引发异常(例如,MemoryError因为你的行太长或TypeError,因为你的行是数字3而不是实际行它成功了。

但是,这并不是一种非常有用的成功。不幸的是,有用的成功更像是“将字节添加到发送缓冲区,将发送缓冲区刷新到套接字,对等方接收字节,接收应用程序以持久的方式对数据执行”。 / p>

LineReceiver中的任何内容都无法告诉您所有这些事情都已发生。标准解决方案是在协议中添加某种确认:当接收应用程序对数据执行操作时,它会发回一些字节,告诉原始发件人消息已被处理。

你不会让LineReceiver.sendLine在这里给你太多帮助,因为它真正知道怎么做就是以特定格式发送一些字节。您需要一个更复杂的协议来处理确认。

幸运的是,Twisted附带了一些。 twisted.protocols.amp是一个:它提供远程方法调用(完成响应)作为基本功能。我发现AMP适用于广泛的应用,因此建议进行新的开发通常是安全的。它在很大程度上取代了旧的twisted.spread(又名“PB”),它同时提供远程方法调用和远程对象引用(因此更复杂 - 根据我的经验,比大多数应用程序需要的更复杂)。还有一些选项更加标准化:例如,Twisted Web包含HTTP实现(HTTP,正如您所知,擅长请求/响应样式交互)。