【发布时间】:2019-02-19 17:13:44
【问题描述】:
我正在实现一个简单的客户端/服务器读取器,我正在使用 DataInputStream 将所有内容读取为字节,然后再进行解析。
这是我的阅读代码:
String line;
String requestString = "";
//client is a Socket that is initialized elsewhere
DataInputStream inputData = new DataInputStream(client.getInputStream());
byte [] messageByte = new byte[1024];
int counter = 0;
while(true) {
int bytesRead = inputData.read(messageByte, counter, 1024-counter);
counter = (counter + bytesRead)%1024;
if(bytesRead == -1) {
System.out.println("Breaking out of loop");
break;
}
line = new String(messageByte, 0, bytesRead);
System.out.println( "GOT > " + line );
}
它可以读取消息,但不能跳出循环,因为最后一次调用 read 没有返回。
【问题讨论】:
-
只有当您到达流的末尾时,您才会因为
read调用而得到-1。在套接字的情况下,这意味着另一端必须关闭连接。 -
counter的目的是什么?似乎它没有任何用途,并且使您的代码更难理解。你可以用int bytesRead = inputData.read(messageByte, 0, messageByte.length);替换int bytesRead = inputData.read(messageByte, counter, 1024-counter); -
你可以使用
available()吗? -
@Progman available 不是一个好的选择,网络上有延迟。现在没有可用的输入,并不意味着以后不会有。
-
@AlexandarPetrov 那么当你期望它不会阻塞时,这个调用阻塞的问题是什么?
标签: java sockets inputstream blocking