Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение данных из сокета 
V
    Опции темы
blur
Дата 28.12.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 9.11.2004

Репутация: нет
Всего: 1



Есть такая проблемка: при чтении данных с сокета иногда приходит целое сообщение, а иногда только часть его. В чем может быть проблема? код примерно такой:

Код

out = new DataOutputStream (clientSocket.getOutputStream());
in =  new DataInputStream(clientSocket.getInputStream());
do {
        byte msgBytes[] = new byte[3200];
    int msgLength = in.read(msgBytes);
} while (clientSocket.isConnected());


Кстати, данная проблема возникает только если сообщение шлется с Windows-машины, с UNIX-машины подобных проблем не наблюдается.

Это сообщение отредактировал(а) blur - 28.12.2007, 12:17
PM MAIL   Вверх
LSD
Дата 28.12.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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.
PM MAIL WWW   Вверх
blur
Дата 28.12.2007, 12:53 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 9.11.2004

Репутация: нет
Всего: 1



Цитата(LSD @ 28.12.2007,  12:50)
Данные могут приходить по частям, и это не зависит от того какая ОС там стоит. Просто читай до тех пор пока не прочтешь сообщение целиком.

А как определить где кончается первое сообщение и начинается второе?
PM MAIL   Вверх
LSD
Дата 28.12.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(blur @  28.12.2007,  12:53 Найти цитируемый пост)
А как определить где кончается первое сообщение и начинается второе?

А это ты уже сам должен решить на уровне протокола. Или фиксированная длинна сообщения, или вначале передавать длинну тела сообщения, или некий завершающий код.


--------------------
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.
PM MAIL WWW   Вверх
blur
Дата 28.12.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 9.11.2004

Репутация: нет
Всего: 1



Цитата(LSD @ 28.12.2007,  13:04)
Цитата(blur @  28.12.2007,  12:53 Найти цитируемый пост)
А как определить где кончается первое сообщение и начинается второе?

А это ты уже сам должен решить на уровне протокола. Или фиксированная длинна сообщения, или вначале передавать длинну тела сообщения, или некий завершающий код.

Понятно, я думал что это может быть уже реализовано в джава-классах.

Это сообщение отредактировал(а) blur - 28.12.2007, 13:17
PM MAIL   Вверх
COVD
Дата 28.12.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата

Понятно, я думал что это может быть уже реализовано в джава-классах.


А это и реализовано. Используемый вами DataStream - это уровень байтов, самый низкий. А есть специализированные классы для чтения/записи строк  или любых сериализуемых обьектов. 

Это сообщение отредактировал(а) COVD - 28.12.2007, 16:43
PM MAIL   Вверх
LSD
Дата 29.12.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(blur @  28.12.2007,  13:17 Найти цитируемый пост)
Понятно, я думал что это может быть уже реализовано в джава-классах.

Посмотри в сторону 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.
PM MAIL WWW   Вверх
blur
Дата 2.1.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 9.11.2004

Репутация: нет
Всего: 1



Цитата(COVD @ 28.12.2007,  16:36)
Цитата

Понятно, я думал что это может быть уже реализовано в джава-классах.


А это и реализовано. Используемый вами DataStream - это уровень байтов, самый низкий. А есть специализированные классы для чтения/записи строк  или любых сериализуемых обьектов.

А что это за классы? Может дадите примерчик? Я имею ввиду чтобы не нужно было отправлять сначала размер сообщения.

Это сообщение отредактировал(а) blur - 2.1.2008, 10:39
PM MAIL   Вверх
v2v
Дата 2.1.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 1
Всего: 56



Код

// получать
 try {
BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str;
while ((str = rd.readLine()) != null) {
System.out.println(str);
}
rd.close ();
} catch (IOException e) { }

// отправлять 

try {
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
wr.write("Hello server");
wr.flush();
} catch (IOException e) {
}


Это сообщение отредактировал(а) v2v - 2.1.2008, 11:06


--------------------
PM   Вверх
Platon
Дата 2.1.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 3
Всего: 40



У меня завелась такая практика первые байты служебные: первый int тип сообщения, второй int длина сообщения. Удобно во многих отношениях.
Легко распознать, + если версии клиентов разные, то к примеру старый клиент может пропустить сообщения, которые он не понимает совершенно безболезненно, без танцев с бубном.
PM MAIL ICQ   Вверх
v2v
Дата 2.1.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 1
Всего: 56



а я попробывал передать сообщения в виде ХМЛ строк. 
очень даже не плохо получилося: немного избыточно, но зато всё красиво стандартизировано и прозрачно.
(правда я не первый такое придумал, оказывается, протокол XMPP на котором работает Jabber полностью передаёт всю инфу между серверами и клиентами в виде ХМЛ).


--------------------
PM   Вверх
Platon
Дата 2.1.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 3
Всего: 40



Лично по мне, так что XML, что сериализация по сети - от лукавого!!! Я предпочитаю бинарный протокол.
PM MAIL ICQ   Вверх
blur
Дата 2.1.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 9.11.2004

Репутация: нет
Всего: 1



Цитата(Platon @ 2.1.2008,  12:15)
Лично по мне, так что XML, что сериализация по сети - от лукавого!!! Я предпочитаю бинарный протокол.

Так если вы говорите, что это все реализовано в java-классах, то зачем городить свои протоколы, xml сюда прикручивать?
PM MAIL   Вверх
Platon
Дата 2.1.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 3
Всего: 40



не понял вопроса.

Добавлено через 54 секунды
Лично я даже не заикался, что в java классх всё реализовано ^_^
К примеру по работе с AIM действительно, всё уже реализовано. joscar к примеру.
PM MAIL ICQ   Вверх
blur
Дата 2.1.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 9.11.2004

Репутация: нет
Всего: 1



Цитата(Platon @ 2.1.2008,  13:17)
не понял вопроса.

Добавлено @ 13:18
Лично я даже не заикался, что в java классх всё реализовано ^_^
К примеру по работе с AIM действительно, всё уже реализовано. joscar к примеру.

А что тут непонятного? Вопрос был такой: 
Цитата

А что это за классы? Может дадите примерчик? Я имею ввиду чтобы не нужно было отправлять сначала размер сообщения.


Или пример (с BufferedReader), который привел v2v не обеспечивает этого?



Это сообщение отредактировал(а) blur - 2.1.2008, 13:26
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.