如何从Tornado的IOStream中读取一个按键

时间:2014-10-29 14:44:35

标签: python tornado

我有一个简单的龙卷风应用程序,它从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')。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

telnet客户端默认为行缓冲模式,因此在用户按Enter键之前不会发送任何内容。您可以使用telnet选项更改此模式:Send data over telnet without pressing enter