【问题标题】:reading inputstream of a socket读取套接字的输入流
【发布时间】:2016-10-08 09:33:27
【问题描述】:

我有sn-p

try {
    is = new BufferedReader(new inputStreamReader(getSocket().getInputStream()));
}
catch(IOException e) {}
while(true) {println(is.readLine());}

基本上,我试图打印发送到从 getSocket() 返回的套接字输入流的每条消息。 我的问题是:

  1. 如果没有消息发送到套接字,返回什么值 从调用 readLine() 方法?是空值还是空值 字符串(即“”)还是别的什么?
  2. 当消息被 发送并已打印出来,输入流发生了什么 那么插座呢?是清空了吗?
  3. 我们是否需要一种方法来检查 仅当输入流有时才调用 println() 方法 要打印的东西?

【问题讨论】:

    标签: java sockets stream readline


    【解决方案1】:
    1. 如果没有任何内容通过流发送 - 尚无任何内容可读取。您的读者正在等待。
    2. 仅从您收到的数据中清空。
    3. 您应该有while(true) 循环,它试图从流中读取该行。您无需检查任何内容。

    如果套接字在第二侧关闭,则阅读器正在读取null。如果第二面在没有关闭套接字的情况下退出,你会得到IOException。

    【讨论】:

    • 非常感谢!但我想在第一个答案中挖掘更多。你说的等待是什么意思?如果我有 while(true) { println("debug"); println(is.readLine()); } 那么在第一条消息发送到流之前,打印出多少“调试”?
    • @TranTriet 只有一个。
    • @TranTriet 看看这里的服务器是如何写的:systembash.com/a-simple-java-tcp-server-and-tcp-client 有一个循环正在监听客户端。客户端连接后,程序一直在readLine()方法等待。
    • 谢谢!您的答案在所有方框中打勾,其中一些!
    • (2) 是。 “不”,不是“是”。
    【解决方案2】:

    如果没有消息发送到套接字,调用 readLine() 方法返回什么值?它是空值还是空字符串(即“”)还是别的什么?

    两者都不是。它会阻塞。

    当一个消息已经发送并被打印出来,那么socket的输入流发生了什么?清空了吗?

    没有。收到的数据已从中删除。可能还有更多待读取的数据等待读取。

    我们是否需要一种方法来检查仅当输入流有要打印的内容时才调用 println() 方法?

    没有。它会一直阻塞,直到收到一行、发生流结束或抛出 IOException。

    您的读取循环不正确。它不检测流结束。通常的写法是:

    while ((line = in.readLine()) != null)
        // ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 2011-05-31
      • 2012-08-16
      • 1970-01-01
      • 2015-09-13
      • 2015-07-12
      • 1970-01-01
      相关资源
      最近更新 更多