【问题标题】:How write characters to TelnetOutputStream one at a time?如何一次向 Telnet OutputStream 写入一个字符?
【发布时间】:2012-04-20 03:58:31
【问题描述】:

我正在使用apache.commons.net.telnet

我有char[] array。我打电话给TelnetClient.getOutputStream().write(array[i]).

我希望我的数据一次发送一个字符,但 Wireshark 显示第一个字符单独发送,其余字符一起发送。 为什么会出现这种情况,如何逐个字符发送数据?

【问题讨论】:

  • 您在 write() 之后是否已经尝试过 Outputstream.flush()?
  • 是的,我在write()之后打电话给flush()

标签: java apache-commons telnet outputstream


【解决方案1】:

您是否尝试在每次调用 write() 后调用 flush()

flush() 函数应该在缓冲区被填充之前发送流中的任何内容。

【讨论】:

    【解决方案2】:

    好的。这是正确的答案。要尽快发送数据,请执行以下操作:

    在您的输出流上调用 setTcpNoDelay(true)。

    用你的整个数组调用 write。你应该更新一次写一个字节。同时写入整个数组会快很多。

    在你写完之后调用flush()。

    这是发送数据的最快方式,也是产生最小延迟的方式。也就是说:一次发送一个字节并不能确保服务器更快地接收它们。

    一次发送一个字节的数据会减慢速度,而不是加快速度。

    【讨论】:

      【解决方案3】:

      如果你真的想一次发送一个字符(为什么,它真的会减慢你的速度)我猜你必须遍历数组并每次调用一个字节的写入。然后在每次写入后刷新。类似的东西(未测试,但它应该给你一个提示)。

      OutputStream os=TelnetClient.getOutputStream();
      for(int i=0;i!=array.length;i++) {
        os.write(array[i]);
        os.flush();
      }
      

      【讨论】:

      • 这可能是因为您的操作系统在发送数据之前一直在等待更多数据。只是一个测试,尝试在每次刷新后添加对 Thread.sleep(10) 的调用。但我仍然不明白你为什么要这样做。一次发送一个字节的数据至少是一次发送所有数据的 100 倍。
      • 我需要实时接收来自telnet服务器的响应!
      • 这真的取决于调用 write() 之间的时间。如果我调用 Thread.sleep(10) 它的工作方式相同,但如果我调用 Thread.sleep(200) 字符一次发送一个。有可能解决这个问题吗?
      • 实时??一次发送一个字节不会给你任何更快的响应。
      • 我说错了。我不仅需要在 '\n' 字符输入之后发送数据。例如,如果我输入了“?” telnet 服务器应该用帮助信息回复我,而不是在输入 '?\n' 之后。
      猜你喜欢
      • 2012-07-28
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 2013-06-06
      • 2017-06-09
      相关资源
      最近更新 更多