Ответы пользователя по тегу Клиент-сервер
  • Правильно ли выделять целый порт под определенную задачу на сервере?

    Griboks
    @Griboks Куратор тега C#
    Вы принимаете сообщение вида байты=порт+ip+нагрузка, где нагрузка, очевидно, вам известна и десериализуема. А дальше уже дело программное, как и чем вы будете фильтровать и парсить байты.

    p.s.
    Лично мне удобнее использовать протоколы аля stateless X over JSON over UTF-8 over TCP.
    Ответ написан
    2 комментария
  • Как написать эхо - сервер?

    Griboks
    @Griboks
    Поскольку сервер должен работать через UDP, соединение между клиентом и сервером не устанавливается. Из-за этого все входящие сообщения выглядят для UDP сервера одинаково, а разделение на клиентов происходит на прикладном уровне. Поэтому невозможно выделить поток для обработки сообщений UDP каждого клиента.

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

    Griboks
    @Griboks Куратор тега C#
    Пустите пинг и трассировку от друга до вас, чтобы узнать проблемный узел.

    Как вам написал, скорее всего, вы просто неправильно настроили сеть.
    Ответ написан
    Комментировать
  • Какие архитектурные подходы выбрать для разработки клиент-серверной игры?

    Griboks
    @Griboks Куратор тега C#
    Вы думаете не в том направлении. Сервер главный, клиенты - рабы его. Захотели куда-то полететь? Спрашивайте разрешения у сервера. Захотели посмотреть данные о планете? Спрашивайте у сервера? Захотели сходить в туалет? Спрашивайте у сервера) Разумеется, всё это для выделенного сервера, который вы хотите написать на C#.

    1) Надо отталкиваться от того, что любой клиент можно подделать. Следовательно, всё, что не отвечает за рендеринг, интерфейс и красивые эффекты, должно храниться и обрабатываться сервером. Клиент должен просто показывать ваши нули и единицы в удобной для пользователя формы.
    2) Любое действие, совершаемое игроком, должно отправляться на сервер и проверяться им. Естественно, по данным, которые хранятся на сервере. Пользователь нажимает кнопку, посылается запрос на сервер, он симулирует действия. Рассматривайте сервер как единственное место, в котором реально происходит "игра" (симуляция мира). Клиент же рассматривайте как клавиатуру, мышку и монитор в оффлайн играх.
    3) Симуляция (которая происходит ТОЛЬКО на сервере) должна быть ни чем иным, как простым кодом. Без всяких переиспользований и прочего. Просто какая-то функция OnClientSendData, которая, грубо говоря, осуществляет покупку от имени приславшего клиента нового корабля, сохраняет id в профиль игрока и возвращает сообщение об успешном выполнении покупки.
    4) Связь между клиентом и сервером должна осуществляться через ваш собственный или выбранный протокол. На низком уровне. Обобщая, без использования стандартных юнитовских rpc, т.к. они не работают с выделенным сервером. Если очень хочется, то работают, но тогда сервер придётся писать на самой юнити, и он уже не будет консольным. В таком случае, опять таки надо забыть про рендеринг и прочее, ведь сервер должен быть быстрым, и на него никто не будет пялиться каждый день. Сборки, разумеется, должны быть разные для сервера и для клиента.
    5) Интерполяция, экстраполяция, сглаживание и прочие умные словечки будут очень полезны в плане разгрузки сервера. Ведь можно каждую секунду передавать координаты планеты всем клиентам, а можно задать его эфемериду на несколько часов вперёд, ограничившись таким образом одной отправкой. Кстати, именно так сделано в GPS.
    6) Некоторые логические действия всё-таки можно производить на клиенте, если их результату сервер сможет доверять. Ну или просто "разрешить" читерство, проводя симуляцию на клиенте, а сервер превратив в "тонкую" базу для синхронизации.
    7) Ну и под конец, необходимо использовать всякие спец. приёмчики. Например, зачем каждый раз загружать с сервера всю карту, если можно загрузить только изменившийся кусок. Некоторые действия можно вообще сделать "локальными". Например, зная результат боя, можно сразу загрузить его и симулировать на клиенте, а не получать каждую секунду новые параметры.
    Ответ написан
    2 комментария