【问题标题】:What is meant by end of stream reached in inputstream.read()?inputstream.read() 中到达的流结束是什么意思?
【发布时间】:2014-11-28 02:16:03
【问题描述】:

我的 android 智能手机是 tcpclient,chipkit wf32 wifi 模块是我的 tcp 服务器。

int bytesRead;
InputStream inputStream = socket.getInputStream();

while ((bytesRead = inputStream.read(buffer)) != -1){
       byteArrayOutputStream.write(buffer, 0, bytesRead);
       response += byteArrayOutputStream.toString("UTF-8");
     }

上面的代码从流中读取数据并复制到缓冲区。如果没有数据到来,它将阻塞。但有时我得到-1。谁能解释得到-1的原因?在文档中提到“到达流的结尾”。但是你能解释一下它的含义吗?谢谢。

【问题讨论】:

  • 这意味着您的流不再包含任何剩余数据;您已到达信息流的末尾。
  • 流的结尾是什么意思?套接字流长度等于我从服务器发送的数据的长度。不是吗?如果流中有数据,它应该返回数据。如果没有数据,它应该等到收到数据吗?这里流的结尾是如何进入图片的?
  • @Kumar 能给我点钱吗?你的钱包是空的是什么意思?
  • @ElliottFrisch 您的意思是 tcpserver 没有更多数据要发送,并且由于客户端的输入流到达了流的末尾吗?
  • @Kumar 不。我的意思是客户说没有更多数据要读取。

标签: java sockets


【解决方案1】:

在套接字的情况下,这意味着对等端关闭了它的连接端,或者至少将其关闭以进行输出。

注意

response += byteArrayOutputStream.toString("UTF-8");

应该在循环之外。我之前已经告诉过你,在你关于这个主题的众多主题中的另一个。

【讨论】:

  • 在我的情况下,对等点是 wifi 模块,它是 tcpserver。所以你说 tcpserver 关闭了连接?
  • 不,别告诉我我说了什么。我说 peer 关闭了连接。 如果您是客户端,则对等方是服务器。如果你是服务器,它就是客户端。
  • 它是有线的。一旦我的模块连接到客户端。我只是发送数据。我永远不会在任何时候调用 socket.close。我也在记录操作。在日志中,它从未显示在 -1 场景期间连接已关闭。
  • 但这就是它的意思。仅此而已。可能您不知道关闭套接字输入或输出流会关闭另一个流和套接字。
  • 我明白了。流从对端关闭。像winsock中的socket.shutdown()函数可能会被服务器调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 2017-12-04
相关资源
最近更新 更多