我在从套接字读取数据时遇到一些问题如果套接字流中有一些空数据,那么DataInputStream就不会读取完整数据,因此在接收端有解析数据的异常。 从套接字读取数据的正确方法是什么,因此任何时候都不会丢失数据? 提前致谢。
答案 0 :(得分:2)
你应该发布用于从套接字读取的代码,但对我来说最可能的情况是读取代码错误地将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上没有方法。如果您使用可用来检测流的结尾,那也是错误的。该函数只告诉你可以不阻塞地读取多少字节(即当前在缓冲区中有多少字节),而不是流中剩余的字节数。
答案 1 :(得分:0)
我个人更喜欢ObjectInputStream而不是DataInputStream,因为它可以处理所有类型,包括字符串,数组甚至对象。
是的,您只能通过1行receive.readObject()
读取整个对象,但不要忘记输入返回的对象。
read()
可能会更容易,因为你在一行中阅读了整个内容,但不准确。逐个读取数据,如下所示:
receive.readBoolean()
receive.readInt()
receive.readChar()
etc..
答案 2 :(得分:0)
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;
}
}