Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Sockets


xman ©   (2004-05-17 20:09:00) 

Мастера, я хочу написать сетевую игру, используя сокет я делаю так, отправляю сообщение с координатой клиенту, но когда отпралять несколько координат сразу то они сливаются в 1 строку.
Как мне избежать это.

Я делал так все координаты я вписую в 1 строку типа '#POS1,2#POS13,4' и т.д. потом отправляю. Но бывают такие ситуации когда нужно отправлять сразу несколько сообщений и это мне не понравилось. И этот способ сильно накручен, приходится вытягивать значения со строки и присваивть объектам.

Я бы хотел узнать как вы реализуете обмен данными.


VLoB   (2004-05-23 23:38:00) [1]

>>Каждому пакету сделать заголовок с указанием длины
зачем, если сокет может вернуть количество принимаемых байт? хотя, могу путать, сам только начал распахивать тему =)

имхо, можно попробовать без строк и без разделителей, вот моя реализация -

делаю буфер в памяти,
первый байт - заголовок (тип пакета, чей, и т.п.), далее, т.к. максимальные координаты в игре и по Х и по У - 2000 точек,
то на хранение каждой - 11 бит (в сумме 22 бита),
еще 22 уходит на координаты попадания, ну и по мелочи на всякие нужные разности, короче, в итоге выходит 66 бит - запихиваю их в буфер и гоню на другую машину, где разбрасываю по нужным переменным... усе

вот только пока не думал, как реализовать к примеру, чтобы 8 клиентов обменивались пакетами, это ж каждый должен знать о каждом,
умножаем 66 на 7, в итоге имеем 462 бита или ~57 байт...хммм... многовато...

может кто-нибудь делал сетевые игры, и знает, какой примерно пакет считается оптимальным по величине (чтобы скорость премлема была и траффик не очень большой был, в случае инета)?
и с какой частотой слать пакеты от машины к машине?


xman   (2004-05-19 22:02:00) [2]

А если несколько клиентов одновременно отправлять будут кучу сообщений. то какие то сообщения будут терятся


Senti   (2004-05-19 15:49:00) [3]

Все очень просто решается. К каждой строке прибавляешь разделитель. Например "#0". А при получении данных просто разбиваешь все снова на строки. Все очень просто и лаконично.

Типа что-то

while pos('#',s) <> 0 do
begin            
 tmp:=Copy(.....);
 MyProcedure(tmp);
 Delete(s,1,pos('#',s));
end;


Григорьев Антон   (2004-05-19 13:09:00) [4]

Каждому пакету сделать заголовок с указанием длины, и читать сначала заголовок, а потом остаток известной длины. Или использовать протокол UDP, в котором пакеты не сливаются.


xman   (2004-05-19 09:41:00) [5]

пишу Сетевой дурак
а вообщето я спросил тошо ни раз я сталкивался с такой проблемой
и интересно било узнать выши методы прием и посылок данных


~ls   (2004-05-19 08:44:00) [6]

В DelphiX есть не плохой компонентик для реализации сетевой игры, причем там уже все сделано с точки зрения сети, тебе только посылать и отправлять!

Если надо - есть статейки по этому поводу.

А еще было бы интересно узнать, что за игра!


Rouse_   (2004-05-17 21:56:00) [7]

Для отправки нескольких координат придумай собственную структуру и отправляй ее... а вообщето Stream...


Наверх

Титульная страница Поиск, карта сайта Написать письмо