Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Надежность println и readln


Автор: polakwilno 14.8.2006, 22:56
Хай пиплы, у мну такая вот ситуация:

Код

clientSocket = new Socket(hostname, port);


Затем на сервере 
Код

os = new PrintStream(clientSocket.getOutputStream());
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));


и у клиента
Код

os = new PrintStream(clientSocket.getOutputStream());
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));


Вопрос: могу ли я быть на 100% уверен, что если клиент/сервер пошлет строку через os.println() то сервер/клиент получат её целиком и неповрежденной? Т.е. если посылалось "АБВГД" то и придет "АБВГД" в 100% случаев.

За ранее благодарен.

Автор: LSD 15.8.2006, 07:54
TCP/IP протокол с гарантированной доставкой, т.е. корректность и целостность передваемых данных контролируются.
Единственное но, если ты посылаешь большой объем данных, и в середине передачи произойдет обрыв связи, то будет передана только часть данных, но ты при этом получишь ексепшн. Но из-за того что ты используешь PrintStream, ты об этом эксепшне не узнаешь.

Автор: polakwilno 15.8.2006, 11:40
Цитата

Но из-за того что ты используешь PrintStream, ты об этом эксепшне не узнаешь.


Хмм...  Неужели catch(IOException e) тут непоможет?

Цитата

Единственное но, если ты посылаешь большой объем данных, и в середине передачи произойдет обрыв связи, то будет передана только часть данных


Может тогда надежнее считывать посимвольно? Я так пытался но в яве с етим ен так просто оказалось smile Скажем используя int n = in.read() n равно 1. Как его теперь конвертировать в обычный char? Операция типа c = (char)n работает некорректно - результат '/u0001' или чтото вроде... 

Автор: LSD 15.8.2006, 11:56
Цитата(polakwilno @  15.8.2006,  12:40 Найти цитируемый пост)
Хмм...  Неужели catch(IOException e) тут непоможет?

Просто PrintStream перехватывает ексепшены. Единственный способ, это делать потом checkError(), но по моему это неудобно, лучше использовать Writer.


Цитата(polakwilno @  15.8.2006,  12:40 Найти цитируемый пост)
Может тогда надежнее считывать посимвольно? Я так пытался но в яве с етим ен так просто оказалось  Скажем используя int n = in.read() n равно 1. Как его теперь конвертировать в обычный char? Операция типа c = (char)n работает некорректно - результат '/u0001' или чтото вроде... 

Зачем, это будет намного медленней. Просто замени PrintStream на Writer и поставь обработку ошибок. Когда произойдет разрыв соединения, ты получишь ошибку и будешь знать что данные не доставлены.

Автор: polakwilno 18.8.2006, 11:14
Ясненько, попробую так...

Спасибо за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)