Я планирую использовать события в проекте игрового сервера, и мне интересно, какой лучший дизайн использовать. Поскольку я не могу найти хороших примеров для своей проблемы, я спрашиваю здесь.События и общие классы на нескольких серверах
Структура проекта сервера, к которой я привык, почти такая: у меня есть сервер входа в систему, сервер мира/канала и общая библиотека для таких классов, как серверные и клиентские классы, которые используются обоими. Весь код связи здесь, например. Серверы происходят из класса сервера. Класс клиента - это оболочка вокруг сокета. Входящие данные анализируются и передаются методам обработчика пакетов.
Теперь я хочу добавить событие, скажем, если клиент подключается, все клиенты получают уведомление. Вместо повторения всех подключенных клиентов, как я привык, клиенты, которые подключаются, должны подписываться на обработчик событий, который запускается от подключающихся клиентов.
Мы, наконец, добираемся до моей проблемы с моим стандартным дизайном, где я могу поставить обратный вызов? Обычно мне нужно создать новый метод, например OnClientConnects или что-то еще, в классе клиента для использования для события. Но мои серверы используют один и тот же клиентский класс, и помещать обработчики событий для них в них кажутся грязными. Я не могу помещать его в другое место, потому что ему нужна информация от подкопированного клиента, такого как сокет.
Единственное другое решение, которое приходит мне на ум, - это отдельные классы клиентов или, скорее, производные классы от него для разных серверов. Хотя это немного сложно, со всем сетевым кодом внутри общих классов, потому что я должен получить собственный клиентский класс там, но это должно быть возможно с помощью переопределенных методов. И я думаю, это все, что я могу сделать.
Все это кажется неправильным, хотя, и мне интересно, действительно ли это приемлемый дизайн или есть лучшая альтернатива.
Спасибо за ваш ответ. Однако событие connect было только примером. Конечно, это тот, который, возможно, оба могут использовать в какой-то момент, но определенно будут уникальные события (возможно, много), которые использует только один из серверов. – Mars
Достаточно справедливо. Я думал, что * эти * обратные вызовы должны были бы быть только в том, что определенный производный серверный класс. – pamphlet
Другим подходом могло бы стать использование более ориентированного на сообщения подхода.Когда происходит событие примечания, создайте экземпляр объекта сообщения и отправьте это сообщение соответствующим сторонам через TCP с типом сообщения («int», если вы сознательно настроены в заголовке), затем запустите приемник через фабрику сообщений , создавая версию «реализация» локально только для получателя, и это точка входа в ваш пользовательский код. Это тот подход, который я использовал для крупномасштабных коммерческих проектов. Это оскорбляет некоторых как «чрезмерно сложных», но у вас есть полный контроль (в том числе за производительность). – pamphlet