Перед выполнением чтения данных из сокета возникает какая-то проблема. Если в потоке сокетов есть некоторые нулевые данные, поэтому DataInputStream не будет считывать полные данные, и поэтому на принимающей стороне есть исключение для анализа данных , Каков правильный способ считывания данных из сокета, чтобы в любое время не было потерь данных? Спасибо заранее.Проблема при чтении данных из Socket
ответ
Вы должны разместить код который используется для чтения из сокета, но для меня, скорее всего, дело в том, что код чтения неправильно интерпретируя 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. Если вы используете доступный для обнаружения конца потока, это также неверно. Эта функция сообщает только, сколько байтов может быть прочитано без блокировки (т. Е. Сколько в данный момент находится в буфере), а не сколько байтов осталось в потоке.
Я лично предпочитаю ObjectInputStream над DataInputStream, так как он может обрабатывать все типы, включая строки, массивы и даже объекты.
Да, вы можете прочитать весь объект только по одной строке 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;
}
}
- 1. Проблема при чтении данных файла
- 2. Проблема при чтении из сокета
- 3. Проблема при чтении данных JSON в angularJs
- 4. MagicalRecord проблема при чтении?
- 5. проблема реализации в каскадном при чтении данных из HDFS
- 6. при чтении из гнезда
- 7. Проблема с Python при чтении из файла
- 8. проблема при чтении файла XML из кувшина
- 9. Проблема при чтении входных значений из TitleWindow
- 10. Проблема с nhibernate при чтении из DB
- 11. Проблема при чтении строк файла
- 12. При чтении данных из базы данных проблемы
- 13. SocketTimeoutException при чтении из потока
- 14. Проблема при чтении события повторения
- 15. HtmlAgilityPack Проблема при чтении html
- 16. проблема при чтении xml-файла
- 17. scanf проблема при чтении double
- 18. проблема при чтении текстового файла
- 19. Проблема при чтении файла Xml
- 20. Проблема TCP - зависает при чтении ответа сервера
- 21. Задержка при чтении данных из viewstate
- 22. Ошибка при чтении данных
- 23. «NSRangeException» при чтении данных из файла
- 24. Цикл бесконечности при чтении данных из файла
- 25. NullReferenceException при чтении данных из локального хранилища
- 26. Проблема при чтении XMLHttpRequest.status при перенаправлении
- 27. переменная переписывается при чтении из базы данных
- 28. Вставка при чтении данных
- 29. python, разница блокировки гнезда perl при чтении данных из него?
- 30. ошибка при чтении g-данных
я использую isavailable и я прочитал целые данные – Sam97305421562
OK, поэтому выкладываю код, или минимальный пример кода, который может дублировать эту проблему. Я сказал, что размышляю и не уверен, не видя кода. – Jherico