Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2010, 17:46   #1
IvanSCM
 
Аватар для IvanSCM
 
Регистрация: 01.11.2008
Сообщений: 9
По умолчанию Абстракция над Indy. Реализация сот, ptp внутри соты.

Собственно Indy есть абстракция над сокетами. Но при разработке мультиплеерного режима в игре USSRGame, настал момент подумать над реализацией еще одного слоя абстракции, между кодом логики приложения и Indy. Решение теоретически простое:

Много игроков и большая карта - высокая нагрузка на сервер и канал, высокий пинг, а это замедление передачи информации, актуальность данных теряется. Разделим карту на соты, а точнее на квадраты, размер квадрата это зона видимости игрока:

Клиент, участник соты:
Посылать и принимать команды авторизации, смены квадратов, загрузки параметров связи с участниками текущего квадрата и соседних в радиусе одного квадрата, сообщения чата на сервер. С участником сети пересылать игровые команды, смена координат и подобного.

Сервер должен хранить и учитывать сессии, клиентов по сотам. Рассылать глобальные команды всем клиентам и всего что они требуют.

Думаю все понятно. Прошу помогать мне в этой теме. Создадим игру вместе!

На данный момент думаю использовать TCP и команды посылать пакетами. Сначала слать номер типа команды, затем когда сервер понял какой тип команды ждать, посылать саму команду. С сетью почти не работал, только вывод html в браузер делаю так (отправка):

Код:
type TCommand = record
  name:integer;
  {*
  0 - ожидание
  1 - сообщение чата
  *}
  end;
type TTextCommand = record
  text:String[56];
  sender:String[24];
  end;

// коннект и прочее пропустим

comm.name:= 1;
TCPClient.WriteBuffer(comm, SizeOf(comm));
text_m.sender:= name;
text_m.text:= text;
TCPClient.WriteBuffer(text_m, SizeOf(text));

прием на сервере:

Код:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var comm:TCommand;
var text:TTextCommand;
begin
   memo1.Lines.Add('Получено');
   case IdWaitCommand of
    0: begin
     AThread.Connection.ReadBuffer(comm, SizeOf(comm));
     IdWaitCommand:= comm.name;
     memo1.Lines.Add('Получено: '+IntToStr(comm.name));
    end;
    1: begin
     AThread.Connection.ReadBuffer(text, SizeOf(text));
     memo1.Lines.Add(text.sender+': '+text.text);
     IdWaitCommand:= 0;
    end;
  else
    memo1.Lines.Add('Получено: '+IntToStr(comm.name));
    IdWaitCommand:= 0;
  end;
end;
НЕ смотреть на написание кода, это набросок принципа работы. все будет работать без компонентов. Дак вот, как я понял нельзя так делать:
Код:
comm.name:= 1;
TCPClient.WriteBuffer(comm, SizeOf(comm));
text_m.sender:= name;
text_m.text:= text;
TCPClient.WriteBuffer(text_m, SizeOf(text));
так как команда может прийти раньше чем ее описание. как реализовывать?
Gta Russian Racing Developer
- Ура!! наша мама девственица: закричали дети.
IvanSCM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как обновить indy 9 на indy 10 Пилигрим Компоненты Delphi 16 30.04.2010 10:11
абстракция текста ошибка студии [C++] ArniLand Общие вопросы C/C++ 3 30.03.2010 18:05
Абстракция текста - другая ошибка[C++] ArniLand Общие вопросы C/C++ 1 29.03.2010 22:25
Класс контейнер - абстракция текста [C++] ArniLand Общие вопросы C/C++ 4 29.03.2010 15:02
Indy 9 против Indy 10 OrdJONY Свободное общение 2 08.11.2008 20:28