Клиентские программы C # — 2, торгующие информацией о переменных — есть ли лучший способ?

#c# #interprocess

#c# #interprocess

Вопрос:

Я пытаюсь отправить информацию об игроке из моей игры моему сетевому клиенту, чтобы затем она была отправлена на сервер.

В настоящее время связь ClientNetwork -> ClientGame поддерживается с помощью XML-файлов. Они читают / записывают туда и обратно с очень высокой скоростью. Если вы используете только один XML-файл для этой торговли, один из них будет время от времени «захламлять» файл, создавая своего рода задержку, когда один не может читать, потому что другой злобно пишет и переписывает.

Чтобы исправить это, у меня есть по 2 каждого из моих XML-файлов. Если он не может прочитать одно, он прочитает другое. Теоретически они должны использовать их оба, поскольку это был бы компромисс между одним и другим. Не работает на должном уровне.

Но моя главная проблема заключается в том, что использование XML в целом очень неаккуратно, десятки инструкций try-catch, чтобы убедиться, что все они довольны (и мой личный фаворит, try catches внутри try catches — МЫ ДОЛЖНЫ ИДТИ ГЛУБЖЕ)

Мне просто любопытно, есть ли лучший способ сделать это. Мне нужна статическая точка переменных, доступ к которой могут иметь обе клиентские программы. Боюсь, кто-то скажет базы данных…

Я хотел бы заявить для всех, кто также изучает это и наткнулся на эту страницу, что разделяемая память — это потрясающе. Хотя мне приходится преобразовывать все строки в символы, а затем в байты и читать их одну за другой, в целом это НАМНОГО лучше, чем иметь дело с вещами, которые не могут одновременно читать / записывать один и тот же файл. Если вы хотите глубже понять это, а не просто использовать, перейдите по этой ссылке, там объясняется множество разновидностей обмена сообщениями и то, как их использовать.

Ответ №1:

Да, есть!

Термин, который вы ищете, — это межпроцессное взаимодействие — обмен данными между двумя процессами на одном компьютере.

Существуют различные методы, которые позволяют двум процессам на одном компьютере взаимодействовать друг с другом, в том числе:

  • Именованные каналы
  • Разделяемая память
  • Сокеты
  • HTTP

К счастью, приложения на C # могут просто использовать платформу WCF для выполнения IPC (межпроцессное взаимодействие) с использованием одного из вышеперечисленных способов, и пусть платформа WCF позаботится о сложных моментах! Вот пара руководств, которые помогут вам начать (их гораздо больше):

Кроме того, одна из приятных особенностей WCF заключается в том, что вы также можете использовать его для обмена данными между различными машинами, просто изменив «Транспорт» (т. Е. метод связи) на тот, который работает по сети, (например, HTTP).

Если вы ориентируетесь на .Net 2.0, вам следует изучить любой из них .Вместо этого сетевое удаленное управление или веб-сервисы.

Комментарии:

1. В точку. Также посмотрите на именованные каналы.

2. Или файлы с отображением памяти в .NET 4

3. Спасибо за ссылки на источники. Хотя у меня такое чувство, что любая попытка использовать это приведет к сбою и записи: это отношения сервер -клиент, которые требуют, чтобы один прослушивал сообщения от другого, и наоборот. Для начала я не смог подключить свою игру к своему серверу, потому что игра всегда будет «пропускать» сообщения — или, поочередно, они начинают посылать сообщения об ошибках друг другу быстрее, чем игра может прочитать… Я думаю, что изучение этой «общей памяти» может быть моим лучшим выбором — переменные в середине должны всегда находиться там, а не поток связи для чтения, как я предполагаю

4. @Remm Похоже, что разделяемая память — ваш лучший выбор, но она доступна только в .Net 4.0. Если с разделяемой памятью не получается, попробуйте опубликовать более конкретный вопрос о ваших проблемах — должна быть возможность обрабатывать ошибки, (например) только повторяя каждую Xms и отслеживая переменные, которые не обновлялись из-за сбоев.

5. Подойдет. На этот раз ты победил, Краген ~

Ответ №2:

У меня выскакивает простой поток TCP. Пусть сетевой клиент откроет прослушивающий TCP-сокет и пусть игра подключится к сетевому клиенту. Вы могли бы продолжать отправлять те же XML-данные, которые вы уже пишете, если хотите.

Комментарии:

1. Смутно уверен, что Лидгрен именно так и поступает. Net works и давайте просто скажем, что моему проекту не нравится подключаться практически ко всему, поэтому вся эта проблема с двумя исполняемыми файлами является огромным обходным путем.

Ответ №3:

Я согласен с ответом на сокет tcp / ip, предложенным Дэвидом. Я бы просто отправил данные в сокет на локальном компьютере и попросил другое приложение прослушать сокет. Вы можете легко и быстро передавать данные, используя этот метод, и он будет работать независимо от того, на какую версию .net framework вы ориентируетесь.