Text Size

Синхронный протокол комнат «Rooms2»

Система полезна для использования совместно с другими протоколами, когда необходимо только распределение клиентов по комнатам.

Пространства имен:

  • FlexibleGameServer.Rooms2

Объекты протокола:

  • Комната (класс Room)
    Создается и управляется сервером, «содержит» список клиентов. Так же комната «сообщает» своим клиентам о других клиентах, в ней находящихся.
    Имеет информацию (тип с интерфейсом ICustomSerializable) и id.

    Комната может быть публичной (присутствовать в списке), доступной или нет для посещения. Есть возможность указать ограничение на максимальное количество клиентов.
    По умолчанию информация о клиенте содержит структуру RoomDefaultPublicInfo, в которой хранится название комнаты.
  • Клиент  (классы LocalRoomClient (на клиенте) и RemoteRoomClient (на сервере))
    Может получать список комнат, заходить в комнаты (но только в одну в момент времени)  и выходить из них.
    Имеет информацию (ICustomSerializable) и id.
    По умолчанию информация о клиенте содержит структуру ClientDefaultPublicInfo, в которой хранится ник.

Тип id – int, т.е. предел значений значительно превышает возможный физический предел сервера. Система использует указанный программистом id клиента в существующей системе. Обычно удобно использовать id сессии, но это не обязательно.

Экземпляр класса RoomsManager присваивает id создаваемым комнатам. Id «0» зарезервирован: он означает, что клиент не находится ни в одной из комнат. После удаления комнаты её id некоторое время будет не доступен. Таким образом невозможна ситуация, когда после удаления комнаты под тем же id была создана новая комната и клиент с устаревшим списком комнат (который пока еще не получил информацию об удалении комнаты и создании новой) делает попытку войти в новую, только что созданную комнат, принимая её за старую.

Слово «синхронность» в названии протокола означает, что при использовании классов Rooms2 вне перегрузок функций этих классов (код, не содержащийся в override функциях класса-наследника Rooms2), следует использовать оператор lock:

lock (MyRoomsManager.LOCK)
{
  // выполнение операций с классами Rooms2.RoomsManager, Rooms2.Room,
  // Rooms2.RemoteRoomClient и Rooms2.LocalRoomClient
}

Если вы хотите использовать систему Rooms2 в .NET языках, не поддерживающих оператор lock (например, UnityScript), применяйте методы Enter и Exit класса System.Threading.Monitor (в качестве аргумента следует передавать поле LOCK экземпляра класса RoomsManager). Например:

Monitor.Enter(MyRoomsManager.LOCK);
try{
  // выполнение операций с классами Rooms2.RoomsManager, Rooms2.Room,
  // Rooms2.RemoteRoomClient и Rooms2.LocalRoomClient
}finally{ // даже в случае возникновения исключения,
              // освобождение блокировки будет выполнено
  Monitor.Exit(MyRoomsManager.LOCK);
}

Список команд, которые сервер отправляет клиенту (см. RoomsProtocol. ServerSends)

Любую из представленных команд можно отправить «вручную», например:
// отправляет команду Init, которая сообщает, что Id клиенту присвоен Id  10. remoteClient.SendTCP(buf=> remoteClient.Formatter.WriteInit(10, buf));

Команда

Примечание

0 Init

Содержит Id, присвоенный клиенту

1 RoomList

Список публичных комнат

2 AddUpdateRoom

Добавить / обновить информацию о публичной комнате или комнате, в которой находится клиент

3 RemoveRoomFromList

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

4 CurrentRoomChanged

Содержит Id комнаты, в которой находится клиент. Id «0» означает, что клиент не находится ни в одной из комнат.

5 ClientsList

Список клиентов в комнате

6 OtherClientJoinedOrUpdated

Информация о новом клиенте, вошедшем в комнату или о клиенте, изменившем свои данные

7 OtherClientLeaved

Уведомление о вышедшем из комнате клиенте

8 EnteringRoomError

Ошибка входа в комнату

Список команд, которые клиент отправляет серверу (см. RoomsProtocol.ClientSends):

Команды можно отправить вручную, используя метод SendTCP и Formatter экземпляра класса клиента.

Команда

Примечание

0 ChangeRoom

Вход в комнату по id или выход из комнаты, если id = 0.
При входе в комнату клиент опционально может передать дополнительные данные, которые будут обработаны на сервере. Например, пароль.
Читать эти данные (вопреки вышеназванным принципам  передачи пакетов) не обязательно.

1 SetMyInfo

Установка данных о клиенте, доступных другим клиентам

Отличия систем Rooms и Rooms2

Изначально в сетевой движок входила система Rooms, которая имела некоторые серьезные недостатки. Именно по этой причине была создана система Rooms2, которая полностью заменила Rooms. Сейчас старая система полностью исключена из состава движка и более не поддерживается. Тем не менее, здесь вы можете узнать отличия между ней и новой системой.

Rooms2, в отличие от Rooms, изначально создавалась для использования совместно с другими протоколами. Она гораздо «легче» Rooms. Практически вся работа внутри Rooms2 выполняется со словарями. Поскольку почти все операции требуют блокировки (синхронного выполнения), я посчитал оптимальным сделать сам протокол синхронным.

В Rooms2 не предусмотрено способа передачи сообщений. Вы можете передавать сообщения в нужном вам формате, используя систему Rooms2 вместе со своим протоколом.

Напротив, Rooms - самодостаточный протокол. Предполагалось, что сообщения будут передаваться непосредственно через систему Rooms.

Характеристика

Rooms

Rooms2

Игрок может находиться в нескольких комнатах одновременно

+

-

Асинхронность

+

-

Отправка сообщений через систему

+

-

Самодостаточность

+
(собственная система передачи сообщений)

-

Удобная система для переопределения функций отправки и обработки команд протокола: Formatter и Parser.

-

+

«Публичные» и «доступные для присоединения» комнаты

-
(наследуйте классы протокола для реализации подобного функционала)

+

Информация о комнате

имя

любые данные*

Информация о клиенте

ник

любые данные*

Количество клиентов

до 65536

не ограниченно

Количество комнат

до 65536

не ограниченно

Интеграция с другими протоколами

не предусмотрена, но возможна

хорошая

Надежность (гарантия корректной работы)

низкая

высокая

Предназначение

чат, сетевая модель с не авторитарным сервером

использование с другими протоколами

Легкость использования

несколько запутанно

удобно

* данные должны храниться в объекте, реализующем интерфейс ICustomSerializable.

Теперь Вы знакомы с Rooms2 и можете приступать к созданию собственного проекта на её основе!

Комментарии  

 
#4 profile 02.11.2018 13:36
Need cheap hosting? Try webhosting1st, just $10 for an year.

Цитировать
 
 
#3 profile 01.11.2018 08:37
Need cheap hosting? Try webhosting1st, just $10 for an year.

Цитировать
 
 
#2 Сергей 02.04.2013 12:46
а то непонятно немного как это делается
Цитировать
 
 
#1 Сергей 02.04.2013 12:45
можете написать пример работы сервера с комнатами
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Тестовая версия

СКАЧАТЬ БЕСПЛАТНО

Тестирование началось!

Пришло время испытать движок.

Пишите Ваши предложения, найденные ошибки и feedback на Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. или в Skype (vbprogr).

Документацию вы найдете на этом сайте.