![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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...