Проблема чтения данных из сокета - PullRequest
0 голосов
/ 31 октября 2009

Я сталкиваюсь с некоторой проблемой при чтении данных из сокета. Если в потоке сокета есть пустые данные, поэтому DataInputStream не будет читать полные данные, и поэтому на принимающей стороне есть исключение для анализа данных. Как правильно читать данные из сокета, чтобы не было потери данных в любое время? Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 31 октября 2009

Вы должны опубликовать код, используемый для чтения из сокета, но для меня наиболее вероятным случаем является то, что код чтения неправильно интерпретирует 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 нет метода. Если вы используете доступные для обнаружения конца потока, это тоже неправильно. Эта функция только сообщает вам, сколько байтов можно прочитать без блокировки (т. Е. Сколько в данный момент находится в буфере), а не сколько байтов осталось в потоке.

0 голосов
/ 02 ноября 2009
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;
 }
 }
0 голосов
/ 31 октября 2009

Я лично предпочитаю ObjectInputStream, а не DataInputStream, поскольку он может обрабатывать все типы, включая строки, массивы и даже объекты.

Да, вы можете прочитать весь объект только на 1 строку receive.readObject(), но не забудьте набрать тип возвращаемого объекта.

read() может быть проще, так как вы читаете все это в 1 строке, но не точно. читать данные по одному, например так:

receive.readBoolean()
receive.readInt()
receive.readChar()
etc..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...