2012-05-02 3 views
1

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

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

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

Мы, наконец, добираемся до моей проблемы с моим стандартным дизайном, где я могу поставить обратный вызов? Обычно мне нужно создать новый метод, например OnClientConnects или что-то еще, в классе клиента для использования для события. Но мои серверы используют один и тот же клиентский класс, и помещать обработчики событий для них в них кажутся грязными. Я не могу помещать его в другое место, потому что ему нужна информация от подкопированного клиента, такого как сокет.

Единственное другое решение, которое приходит мне на ум, - это отдельные классы клиентов или, скорее, производные классы от него для разных серверов. Хотя это немного сложно, со всем сетевым кодом внутри общих классов, потому что я должен получить собственный клиентский класс там, но это должно быть возможно с помощью переопределенных методов. И я думаю, это все, что я могу сделать.

Все это кажется неправильным, хотя, и мне интересно, действительно ли это приемлемый дизайн или есть лучшая альтернатива.

ответ

0

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

Обычно я бы библиотеку сети, которая разделяется между клиентом и сервером. И какой-то класс Application или Framework, который может содержать общие для клиента и сервера вещи, включая чтение конфигурации, инициализацию различных подсистем (ведение журнала, потоки и т. Д.).

Тогда, да, у будет есть вывод для клиента и различных типов серверов (возможно, с промежуточным классом для разных серверов, так как часто есть функции, общие для серверов, но отдельно от клиентов).

И, чтобы ответить на ваш конкретный вопрос, я думаю, что это нормально, чтобы этот обратный вызов был доступен как для клиентов, так и для серверов. Для сервера вполне разумно что-то делать, когда клиент подключается. Даже если вам сейчас не нужно, я могу представить, что вы в будущем. По крайней мере, сервер мог зарегистрировать событие в файле журнала. Но дело в том, что обработка обратного вызова относится к классам клиентских/genericServer/loginServer/worldServer.

+0

Спасибо за ваш ответ. Однако событие connect было только примером. Конечно, это тот, который, возможно, оба могут использовать в какой-то момент, но определенно будут уникальные события (возможно, много), которые использует только один из серверов. – Mars

+0

Достаточно справедливо. Я думал, что * эти * обратные вызовы должны были бы быть только в том, что определенный производный серверный класс. – pamphlet

+0

Другим подходом могло бы стать использование более ориентированного на сообщения подхода.Когда происходит событие примечания, создайте экземпляр объекта сообщения и отправьте это сообщение соответствующим сторонам через TCP с типом сообщения («int», если вы сознательно настроены в заголовке), затем запустите приемник через фабрику сообщений , создавая версию «реализация» локально только для получателя, и это точка входа в ваш пользовательский код. Это тот подход, который я использовал для крупномасштабных коммерческих проектов. Это оскорбляет некоторых как «чрезмерно сложных», но у вас есть полный контроль (в том числе за производительность). – pamphlet

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