我有一个简单的龙卷风应用程序,它从telnet客户端读取数据。 我使用基于TCPServer的处理程序来处理telnet会话(简化了代码示例)。
class CliServer(TCPServer, LoggerMixin):
def __init__(self):
super(CliServer, self).__init__()
def handle_stream(self, stream, address):
#Some irrelevant code
self.stream.read_bytes(max_buffsize, callback=self._on_read, streaming_callback=None, partial=True)
def _on_read(self, data)
#process data
pass
处理程序在主IOLoop中注册:
my_fd = self.create_socket(self.options.port, self.options.host)
server = CliServer(self.options.current_scope)
server.add_socket(socket.fromfd(my_fd,
socket.AF_INET,
socket.SOCK_STREAM))
我想在从套接字读取数据后立即收到任何数据块。这块数据将由" CliServer._on_read回调"处理。
我当前实现的问题是方法BaseIOStream.read_bytes在用" \ r \ n"终止后立即为我提供数据,这对我来说太迟了。 例如,当telnet用户键入" ab \ tc \ n"时,_on_read回调将被调用一次" ab \ tc"数据,而不是每个字符被调用4次(' a'' b',' \ t'' c')。
我做错了什么?
答案 0 :(得分:1)
telnet客户端默认为行缓冲模式,因此在用户按Enter键之前不会发送任何内容。您可以使用telnet选项更改此模式:Send data over telnet without pressing enter