2009-03-22 3 views
0

В настоящее время я пишу многопроцессорный сетевой игровой сервер (один процесс гейткипера, который рассказывает игрокам, какие игры в настоящее время работают, и позволяет им создавать и присоединяться к играм, а также процесс на каждый игровой экземпляр).В каких случаях следует закрыть TCP-соединение?

В каких случаях было бы полезно, чтобы гейткипер отказал TCP-соединение с клиентом и в каких случаях он должен продолжать прослушивание? Например. должен ли гейткипер закрыть соединение после того, как клиент успешно присоединился к игре или получил список игр или когда произошла ошибка (например, в игре нет свободных слотов, в которые он пытается присоединиться). Или соединение должно завершиться таймаутом? Благодарю.

ответ

1

Простейшие протоколы часто используют отдельное соединение для каждой отдельной транзакции. Веб-браузеры в своем простейшем режиме работы просто подключились, чтобы загрузить страницу, а затем отключиться. Но одновременное подключение и отключение к одному и тому же серверу несло накладные расходы, поэтому также возможно reuse an existing connection.

С другой стороны, если между использованием соединения будут длительные задержки, а есть большое количество клиентов, вы должны учитывать ограниченное количество одновременных соединений, которыми может управлять сервер. Здесь может быть полезен тайм-аут бездействия.

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

+0

Итак, я вижу, что я должен закрыть соединение только по таймауту или когда пользователь присоединяется к игре или уходит добровольно, чтобы он обновлялся по состоянию доступных игр. Благодарю. – dpq

0

Разработать протокол самым простым способом, который мог бы работать. Вероятно, это означает закрытие соединения в конце транзакции.

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

Клиент всегда может сделать другой позже, если ему нужно задать другой вопрос.

Если вам нужно масштабировать до очень высоких нагрузок (подумайте о 10k параллельных сеансах на сервер), подумайте об использовании UDP, где сервер может использовать одно (или небольшое количество) сокетов для сервера большое количество клиентов.

2

Я работаю над сетевыми играми для жизни. Все наши соединения, которые не являются веб-или XML-запросами, остаются открытыми, если они актуальны. Клиент открывает соединение с сервером, и он остается открытым до тех пор, пока не произойдет одно из следующих событий:

  1. Клиент отключается из-за нормальной работы. В TCP это в конечном итоге уничтожит ваше соединение в ситуациях МОСТ. Однако, с некоторыми устройств сетевых соединений/сигнал разъединение не присылают чисто так что вам нужно резервное копирование
  2. В клиента время ожидания. Вы хотите установить это довольно высокое, в зависимости от латентности. Для чего-то вроде сервера гейткипера, может быть, 5 секунд? Затем вы можете установить его до делать периодический пинг каждые 2,5 секунды или около того, если вы не уверены, что данные обычно отправляются достаточно часто , чтобы сохранить соединение в сети.
  3. Сервер загружает плеер. Если игрок делает что-то недействительное, например , попробуйте обмануть, сервер будет принудительно отключить плеер. Это делает это первой отправку разъединения пакета (с сообщением об ошибке , если это применимо), а затем через некоторое время убивая соединение

Я бы посоветовал против использования UDP для большинства сетевых игровых приложений. UDP имеет более сложное время, используя различные настройки брандмауэра, которые используются в наши дни, и если вы делаете что-то неопределенно важное, вам придется написать систему гарантирования пакетов поверх UDP ... что в основном является тем, что TCP , От старой версии нашего движка до нашего нового мы переключились с UDP на TCP.

+0

Спасибо, ты был очень полезен. – dpq

Смежные вопросы