【发布时间】:2009-10-31 05:18:15
【问题描述】:
我在从套接字读取数据时遇到一些问题如果套接字流中有一些空数据,因此DataInputStream不会读取完整数据,因此在接收端解析数据时会出现异常。 从套接字读取数据的正确方法是什么,因此在任何时候都不会丢失数据? 提前致谢。
【问题讨论】:
我在从套接字读取数据时遇到一些问题如果套接字流中有一些空数据,因此DataInputStream不会读取完整数据,因此在接收端解析数据时会出现异常。 从套接字读取数据的正确方法是什么,因此在任何时候都不会丢失数据? 提前致谢。
【问题讨论】:
您应该发布用于从套接字读取的代码,但对我来说,最可能的情况是读取代码错误地将 0 字节解释为类似于此代码的流的结尾
InputStream is = ...;
int val = is.read();
while (0 != (val = is.read()) {
// do something
}
但是流结束指示符实际上是-1
InputStream is = ...;
int val = is.read();
while (-1 != (val = is.read()) {
// do something
}
编辑:回应您对使用isavailable() 的评论。我假设您的意思是available(),因为isavailable() InputStream 上没有方法。如果您使用 available 来检测流的结束,那也是错误的。该函数仅告诉您可以在不阻塞的情况下读取多少字节(即缓冲区中当前有多少字节),而不是流中还剩下多少字节。
【讨论】:
我个人更喜欢 ObjectInputStream 而不是 DataInputStream,因为它可以处理所有类型,包括字符串、数组甚至对象。
是的,您只能通过 1 行 receive.readObject() 读取整个对象,但不要忘记对返回的对象进行类型转换。
read() 可能更容易,因为您在 1 行中阅读了整个内容,但并不准确。一个一个地读取数据,像这样:
receive.readBoolean()
receive.readInt()
receive.readChar()
etc..
【讨论】:
String finalString = new String("");
int finalSize = remainingData;//sizeOfDataN;
int reclen = 0;
int count_for_breaking_loop_for_reading_data = 0;
boolean for_parsing_data = true;
while(allDataReceived == false) {
ByteBuffer databuff = ByteBuffer.allocate(dis.available());
// System.out.println("bis.availbale is "+dis.available());
databuff.clear();
databuff.flip();
dis.read(databuff.array());
String receivedStringN = trimNull(databuff.array());
finalString = finalString + receivedStringN;
System.out.println("final string length "+finalString.length());
if(finalString.length() == finalSize) {
allDataReceived = true;
}
count_for_breaking_loop_for_reading_data++;
if(count_for_breaking_loop_for_reading_data > 1500) {
For_parsing_data = false;
Break;
}
}
【讨论】: