2009-10-31 4 views
0

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

ответ

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 
} 

EDIT: в ответ на ваш комментарий по использованию isavailable(). Я предполагаю, что вы имеете в виду available(), так как нет способа на isavailable() InputStream. Если вы используете доступный для обнаружения конца потока, это также неверно. Эта функция сообщает только, сколько байтов может быть прочитано без блокировки (т. Е. Сколько в данный момент находится в буфере), а не сколько байтов осталось в потоке.

+0

я использую isavailable и я прочитал целые данные – Sam97305421562

+1

OK, поэтому выкладываю код, или минимальный пример кода, который может дублировать эту проблему. Я сказал, что размышляю и не уверен, не видя кода. – Jherico

0

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

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

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

receive.readBoolean() 
receive.readInt() 
receive.readChar() 
etc.. 
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; 
} 
} 
Смежные вопросы