繁体   English   中英

从套接字读取数据时出现问题

[英]Issue in reading data from Socket

在从套接字读取数据时,我遇到一些问题。如果套接字流中有一些空数据,则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上没有任何方法。 如果您使用可用来检测流的结尾,那也是错误的。 该函数仅告诉您可以无阻塞地读取多少个字节(即,缓冲区中当前有多少个字节),而不是流中还有多少个字节。

我个人更喜欢ObjectInputStream而不是DataInputStream,因为它可以处理所有类型,包括字符串,数组甚至对象。

是的,您只能通过1行receive.readObject()读取整个对象,但不要忘记对返回的对象进行类型转换。

read()可能会更容易,因为您只需要一行就可以读取整个内容,但是并不准确。 依次读取数据,如下所示:

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;
 }
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM