|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
22.04.2011, 16:36 | #1 | ||
Пользователь
Регистрация: 30.05.2009
Сообщений: 26
|
Слипаются сообщения в сокетах
Сервер отправляет несколько сообщений в цикле
Цитата:
Цитата:
Как сделать так, чтобы они не слипались? |
||
22.04.2011, 17:13 | #2 |
Форумчанин
Регистрация: 21.04.2010
Сообщений: 125
|
у тебя все слипаться? у меня точно такая же проблема на java, пробивал в цикле ставить задержку таймером - все равно не помогло. Что же делать?
|
22.04.2011, 17:25 | #3 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
> Как сделать так
> Что же делать? - вставлять разделитель между сообщениями - каждое сообщение предварять его длиной
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
22.04.2011, 17:34 | #4 |
Форумчанин
Регистрация: 21.04.2010
Сообщений: 125
|
|
22.04.2011, 17:51 | #5 | |
Пользователь
Регистрация: 30.05.2009
Сообщений: 26
|
Цитата:
|
|
22.04.2011, 18:00 | #6 |
Форумчанин
Регистрация: 21.04.2010
Сообщений: 125
|
я разделяю сообщения с помощю "\1"(ASCII). все что между "\1"..."\1" и есть сообщения.
|
22.04.2011, 18:11 | #7 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
> то есть нужно сделать искусственную задержку, чтобы сеанс передачи заканчивался?
нет, разделитель — это набор байт, который не может встретиться в вашем сообщении. Например 0xFFFFFFFF. Тогда, просканировав принятый поток байт, и найдя в нём такой разделитель можно понять, где закончилось предыдущее и началось новое сообщение. Если разделитель не найден, значит сообщение принято не полностью, и надо ещё раз читать из сокета данные. А отправитель вставляет разделитель после/перед каждым сообщением. > а код можна? на яве? не, слабо.. да ну это просто ведь. На передающей стороне: 1) посылаем 2 байта, длину нашего сообщения (от 0 до 65535, если нужно больше, то договариваемся, что длина занимает не 2, а 4 или больше байт). 2) посылаем само сообщение. На принимающей стороне: 1) читаем 2 байта (или 4 или сколько решили) из потока, это будет длина сообщения 2) принимаем ровно столько байт из сокета, сколько указано в длине ТСП — это ведь поток, он не обязан передавать данные ровно теми пачками, которые в него передают на отправляющей стороне. Данные могут прибывать хоть по 1 байту за раз, к этому надо быть готовым. ТСП только гарантирует, что данные прийдут все, и в том порядке, в котором они отосланы. Ну или произойдёт обрыв связи. В принципе, если сообщения короткие (до 1300 байт), и потеря некоторых из них не очень критична, можно юзать UDP. Там каждое сообщение приходит с той длиной, которая была задана отправителем. Или не приходит, т.к. ЮДП не гарантирует доставки. И даже не гарантирует, что сообщения прийдут в том порядке, в котором были отправлены.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
22.04.2011, 19:10 | #8 |
Пользователь
Регистрация: 30.05.2009
Сообщений: 26
|
Я делаю две программы для чата - типа аська по локальной сети (клиент - сервер)
Если просто посылаешь сообщения: пишешь, жмёшь Enter, и так несколько раз - ничего не слипается! (наверное, потому что пока ты пишешь новое сообщение, происходит задержка) А вот когда сервер синхронизирует список клиентов с новыми клиентами, он быстро отправляет им много сообщений в цикле - и тут они слипаются! Значит, задержка всё-таки имеет значение? И можно сделать небольшую искусственную, порядка миллисекунды? (чтобы пользователь не заметил) |
22.04.2011, 19:56 | #9 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
хочется нестандарного секса — добавляйте задержки, авось как-нибудь именно в вашей сети это когда-нибудь заработает.
хочется написать нормальную программу — читайте, что вам пишут.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
23.04.2011, 21:32 | #10 |
Пользователь
Регистрация: 30.05.2009
Сообщений: 26
|
Я попробовал сделать таким образом:
Сервер: * send - посылает сообщение клиенту ("Важное Сообщение") * recv - принимает сообщение от клиента ("Сообщение принял! Жду следующего!") * send - посылает сообщение клиенту ("Важное Сообщение") * recv - принимает сообщение от клиента ("Сообщение принял! Жду следующего!") Клиент: * recv - принимает сообщение от сервера ("Важное Сообщение") * send - посылает сообщение серверу ("Сообщение принял! Жду следующего!") Это сделано для того, чтобы как в разговоре между людьми: если собеседнику нужно сказать несколько фраз, а он говорит, потом слушает, а потом снова говорит, то его фразы "не сливаются" ! Но на деле почему-то этот процесс рассинхронизируется, и проги вылетают (повреждены стеки у принимающих переменных, в которые записываются сообщения) Как это исправить? Есть ли другие способы оповещения сервера клиентом о приёме сообщения? Последний раз редактировалось MrRockchip; 23.04.2011 в 22:50. |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Чат на сокетах | yandzee | Общие вопросы C/C++ | 6 | 11.12.2010 14:50 |
пакеты в сокетах | Lemon2009 | Общие вопросы по Java, Java SE, Kotlin | 0 | 10.04.2010 14:32 |
UDP в сокетах | HTL | Работа с сетью в Delphi | 2 | 02.04.2010 21:04 |
Переадресация на сокетах | yres51447 | Работа с сетью в Delphi | 2 | 29.03.2010 15:01 |
Авторегистратор на сокетах | Astron | Работа с сетью в Delphi | 5 | 11.03.2010 12:06 |