![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| blur |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
Есть такая проблемка: при чтении данных с сокета иногда приходит целое сообщение, а иногда только часть его. В чем может быть проблема? код примерно такой:
Кстати, данная проблема возникает только если сообщение шлется с Windows-машины, с UNIX-машины подобных проблем не наблюдается. Это сообщение отредактировал(а) blur - 28.12.2007, 12:17 |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
Данные могут приходить по частям, и это не зависит от того какая ОС там стоит. Просто читай до тех пор пока не прочтешь сообщение целиком.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| blur |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
А как определить где кончается первое сообщение и начинается второе? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
А это ты уже сам должен решить на уровне протокола. Или фиксированная длинна сообщения, или вначале передавать длинну тела сообщения, или некий завершающий код. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| blur |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
Понятно, я думал что это может быть уже реализовано в джава-классах. Это сообщение отредактировал(а) blur - 28.12.2007, 13:17 |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
А это и реализовано. Используемый вами DataStream - это уровень байтов, самый низкий. А есть специализированные классы для чтения/записи строк или любых сериализуемых обьектов. Это сообщение отредактировал(а) COVD - 28.12.2007, 16:43 |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
Посмотри в сторону RMI, если у тебя и клиент и сервер на Java. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| blur |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
А что это за классы? Может дадите примерчик? Я имею ввиду чтобы не нужно было отправлять сначала размер сообщения. Это сообщение отредактировал(а) blur - 2.1.2008, 10:39 |
||||
|
|||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 1 Всего: 56 |
Это сообщение отредактировал(а) v2v - 2.1.2008, 11:06 |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 3 Всего: 40 |
У меня завелась такая практика первые байты служебные: первый int тип сообщения, второй int длина сообщения. Удобно во многих отношениях.
Легко распознать, + если версии клиентов разные, то к примеру старый клиент может пропустить сообщения, которые он не понимает совершенно безболезненно, без танцев с бубном. |
|||
|
||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 1 Всего: 56 |
а я попробывал передать сообщения в виде ХМЛ строк.
очень даже не плохо получилося: немного избыточно, но зато всё красиво стандартизировано и прозрачно. (правда я не первый такое придумал, оказывается, протокол XMPP на котором работает Jabber полностью передаёт всю инфу между серверами и клиентами в виде ХМЛ). |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 3 Всего: 40 |
Лично по мне, так что XML, что сериализация по сети - от лукавого!!! Я предпочитаю бинарный протокол.
|
|||
|
||||
| blur |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
Так если вы говорите, что это все реализовано в java-классах, то зачем городить свои протоколы, xml сюда прикручивать? |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 3 Всего: 40 |
не понял вопроса.
Добавлено через 54 секунды Лично я даже не заикался, что в java классх всё реализовано ^_^ К примеру по работе с AIM действительно, всё уже реализовано. joscar к примеру. |
|||
|
||||
| blur |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
А что тут непонятного? Вопрос был такой:
Или пример (с BufferedReader), который привел v2v не обеспечивает этого? Это сообщение отредактировал(а) blur - 2.1.2008, 13:26 |
||||
|
|||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: 1 Всего: 56 |
уважаемый, мой пример позволяет просто передавать и получать строковые данные по сети, а вот какие данные передавать, так что бы клиент и сервер понимали друг друга - это уже ваше задание , и если вы планируете делать это с помощью сокетов, то вам придётся весь протокол самому продумывать.
|
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Обеспечивает. В приведенном примере отправляются строки текста. Каждая отправленная строка в wr.write("Hello server") автоматически завершается символом окончания строки. При чтении в str = rd.readLine() строка автоматически распознается по наличию этого символа. А когда передающая сторона закроет поток, то на приемной выскочит null , потому что автоматически будет послан EOF (end Of File). |
|||
|
||||
| blur |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
v2v,
COVD, Вы меня совсем запутали. Мне нужно просто отсылать текстовые сообщения (длина их может быть переменной). Таким образом вроде бы никакого особенного протокола придумывать не нужно, что будет содержать текстовое сообщение ведь не важно. Данный пример как я понимаю позволяет гарантированно получить всё текстовое сообщение даже если оно в процессе передачи было фрагментированно на несколько кусков? Это сообщение отредактировал(а) blur - 2.1.2008, 17:13 |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 3 Всего: 40 |
||||
|
||||
| COVD |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Не нужно.
Да. Метод readLine вернет строку только целиком и только после того, как получит символ конца строки. Даже если из-за задержек в интернете она будет передаваться по одной букве с паузами между ними. Это сообщение отредактировал(а) COVD - 2.1.2008, 17:33 |
||||
|
|||||
| blur |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
COVD,
Понятно, тогда получается что readLine вернет null, когда удаленный сокет закроет соединение? Добавлено через 1 минуту и 35 секунд COVD, Понятно, тогда получается что readLine вернет null, когда удаленный сокет закроет соединение? |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Да. Это конец сеанса связи.
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Работа с сетью | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |