1

我正在制作一个 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();

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

4

3 回答 3

1

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

类的available方法InputStream总是返回 0。

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

尝试使用BufferedInputStream.

BufferedInputStream in = new BufferedInputStream(clientSocket.getInputStream());
于 2013-06-27T13:06:23.407 回答
0

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

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

于 2013-06-29T03:39:06.017 回答
-1

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

在串行通信中,当您发送消息然后立即调用时available(),您通常会得到 0,因为串行端口尚未回复任何数据。

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

试试这个线程中断不会结束对输入流读取的阻塞调用

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

new BufferedOutputStream(clientSocket.getOutputStream()));
new BufferedInputStream (clientSocket.getInputStream())
于 2013-06-27T13:12:36.110 回答