【问题标题】:Why InputStream.inAvailable() is always returning 0?为什么 InputStream.inAvailable() 总是返回 0?
【发布时间】:2013-06-25 00:01:27
【问题描述】:

我正在制作一个 android 应用程序并将一个 xml 发送到一个 IP 地址。我应该取回一个 xml 作为响应,但输入流缓冲区中的字节总是空的。我正在使用以下代码:

 String sMessage = "<Server><CONNECT><IP>192.168.1.14</IP><Client_ID>123</CLIENT_GUID></CONNECT></Server>";

 Socket clientSocket = null;
 clientSocket = new Socket("192.168.252.148",34543);
 PrintWriter pw = new PrintWriter(clientSocket.getOutputStream(),true);

 pw.write(sMessage);
 InputStream in = clientSocket.getInputStream();
 byte[] buffer = new byte[in.available()];
 System.out.println("buffer size: "+buffer.length);

 pw.close();
 in.close();
 clientSocket.close();

知道为什么我的输入流中没有字节。提前致谢。

【问题讨论】:

    标签: android sockets inputstream


    【解决方案1】:

    我应该返回一个 xml 作为响应,但输入流缓冲区中的字节

    也许是这样,但不是即时的,这是您的代码所假设的。 available() 的正确用法很少(如果有的话),这不是其中之一。只需阻塞读取即可。

    【讨论】:

      【解决方案2】:

      .available() 不能用于进程间通信(包括串行),因为它只检查当前进程中是否有可用数据(在输入缓冲区中)。

      在串口通信中,当你发送一个消息然后立即调用available()你会得到0,因为串口还没有回复任何数据。

      解决方法是在单独的线程中使用阻塞read()(用interrupt()来结束):

      try this Thread interrupt not ending blocking call on input stream read

      在某些流上(例如具有内部缓冲区的BufferedInputStream,),会读取一些字节和kept in memory,因此您可以读取它们without blocking the program flow。在这种情况下,available() 方法会告诉您缓冲区中保留了多少字节。

      new BufferedOutputStream(clientSocket.getOutputStream()));
      new BufferedInputStream (clientSocket.getInputStream())
      

      【讨论】:

      • 您的前两段完全不正确。它对实现检查内核缓冲区的内容是开放的,而 Socket 输入流的可用方法正是通过 FIONREAD 完成的。我希望串行或并行端口流也能做到这一点。
      【解决方案3】:

      http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()

      InputStream 类的 available 方法始终返回 0。

      这个方法应该被子类覆盖。

      尝试使用BufferedInputStream 进行换行。

      BufferedInputStream in = new BufferedInputStream(clientSocket.getInputStream());
      

      【讨论】:

      • 只有在读过之后才会有丝毫不同。
      • @EJP 我没听懂。谢谢!
      猜你喜欢
      • 2021-01-24
      • 2016-09-16
      • 2020-05-25
      • 2013-02-26
      • 1970-01-01
      • 2013-02-14
      • 2011-12-13
      • 2011-06-28
      相关资源
      最近更新 更多