在Twisted Python中,数据被写入协议的传输,但是通过覆盖dataReceived方法来接收。从交通工具上读取数据有规律吗?当使用inlineCallbacks
实现状态时,这会很有帮助
例如:
class SomeProtocol(Protocol):
@defer.inlineCallbacks
def login(self):
self.transport.write('login')
resp = yield self.transport.read(5, timeout=1) # this doesn't exist
if resp != 'user:':
raise SomeException()
self.transport.write('admin')
resp = transport.read(9, timeout=1)
if resp != 'password:':
raise SomeException()
self.transport.write('hunter2')
# ... etc
这些年来,已经有几次尝试实现这样的api。没有人获得任何吸引力。我想他们现在都被抛弃了。你知道吗
原则上,这并不难实现。您只是将dataReceived回调(push样式的API)转换为pull样式的API。你知道吗
实际上,生成的代码是脆弱的,并且往往包含更多的bug。你知道吗
我认为您试图解决的问题是
dataReceived
是解析字节流的非常低级的原语。你知道吗有许多可能的解决办法。您可以尝试构建一个更高级别的基于协议的工具,它了解协议的各个方面(Twisted中的所有协议实现基本上都是这样做的)。您还可以查看像tubes这样的第三方库(它为处理字节流提供了不同的抽象)。你知道吗
最后,当数据到达时,我维护了一个推迟回调的列表,并缓冲传入的数据,直到它满足列表中第一个推迟回调所需的数据长度。你知道吗
它当前要求count为非零。最好扩展它以支持返回当前在读取缓冲区中的内容,并在有超时但不计数的情况下读取,以便在超时后返回缓冲区中的内容。你知道吗
相关问题 更多 >
编程相关推荐