2009-08-23 2 views
2

Я хочу использовать WCF для двухсторонней связи без открытия порта на клиенте.WCF двухсторонняя HTTP-связь для обхода брандмауэров

Я развиваю нечто вроде приложения P2P (похожее на teamviewer/logmein), где вам не нужно открывать порты для связи.

Как выполнить двухстороннюю связь через HTTP/HTTPS без необходимости открытия порта в клиенте?

Примечание: Порт 80 можно открыть на сервере ... никаких проблем с этим.

Thanks

ответ

5

Well эти системы вы упоминаете работу следующим образом. Сначала они пытаются заставить клиента A и клиента B напрямую связываться с различными топологиями, которые в основном требуют, чтобы один из них позволял входящим соединениям, если это не удается, они возвращаются к третьей стороне, которая действует как человек посередине. Таким образом, клиент A разговаривает с сервером и отправляет ему сообщения для клиента B. Затем клиент A получает сообщения, адресованные ему обратно в ответ. Клиент B отправляет его сообщения на сервер и получает сообщение от клиента A с сервера. Таким образом, оба клиента A и B всегда инициируют соединение и не должны открывать порт для входящего трафика.

Если я правильно понимаю в вашем случае, вы всегда хотели бы, чтобы мужчина посередине. Для этого вам нужно будет написать службу WCF, которая предоставляет все соответствующие методы. Например, такие вещи, как

  • недействительный SendMessageToClient (Guid SenderId, Guid recipientId, тзд сообщений)
  • Сообщение [] GetMessages (Guid recipientId)

то есть те методы, соответственно, сохранять и извлекать эти объекты сообщений откуда-то (например, база данных или очередь или что-то еще).

Затем напишите клиент, который подключается к службе WCF, используя привязку HTTP и вызывая методы на сервере и обрабатывая результаты.

Я надеюсь, вы понимаете, что

  • а) это не очень эффективный способ общения.
  • b), что трудно проверить и отладить и понять, что происходит, поскольку существует так много сторон, и общение является асинхронным, живущим в трех разных процессах.
  • c) он добавляет дополнительный слой поверх сообщения, поэтому вам нужно держать его в поле зрения (и предпочтительно в коде), когда вы имеете дело с битами инфраструктуры и когда вы имеете дело с фактическим протокол clientA и clientB говорят друг с другом в объектах Message.

Псевдо (код) Пример

в этом примере я полагаю, объект сообщения нет ничего более строки и единственная команда «whattimeisit», к которому ответ местное время в строке форма

  • Clientâ делает вызов server.SendMessageToClient ("Clientâ", "clientB", "whattimeisit");
  • Сервер хранит это сообщение в базе данных с ID 1
  • КлиентB делает вызов на сервер GetMessages ("clientB");
  • Сервер извлекает сообщение с ID 1
  • ClientB recieves назад "whattimeisit" в качестве ответа
  • ClientB делает вызов server.SendMessageToClient ("clientB", "Clientâ", "19:50:12");
  • Сервер хранит это сообщение в базе данных с ID 2
  • ClientA делает вызов на сервер GetMessages ("clientA");
  • сервер получает сообщение с ID 2
  • Clientâ recieves назад «19:50:12» в качестве ответа
+0

Привет, в вашем псевдокоде ... см. Эту часть «КлиентB делает вызов на сервер GetMessages (« clientB »);« .... Если я использую таймер для этого, он будет потреблять большую пропускную способность на моем сервере правильно? Топология и все абсолютно правильно. Это то, что мне нужно. Но мне нужно выполнить это в сценарии реального мира. – Josh

+0

Итак, я думал, что способ сделать это - позволить клиентам подключиться к серверу и открыть сеанс. и пусть сервер вызывает метод на клиенте через один и тот же сеанс ... Есть ли другой способ? (Я не могу использовать таймер, так как многие клиенты делают это, потребляя всю интернет-пропускную способность моего сервера) – Josh

+0

Что касается полосы пропускания. Используемая ширина полосы будет зависеть от размера объекта сообщения. Большим напряжением будет количество одновременных соединений, это зависит от количества одновременных клиентов. WCF масштабируется очень хорошо, вы должны иметь возможность обрабатывать выделение запроса/сек, и, если нужно, вы можете добавить дополнительные серверы, которые они больше не стоят. Я не знаю, какой тип связи вы хотите сделать, и как высокое/низкое количество запросов на каждый клиент/за каждый таймфрейм. – olle

1

Я не уверен, что понимаю. Целью цифровых брандмауэров является (как правило) контроль каналов связи. Если вы хотите общаться в обход брандмауэров, у вас есть два варианта.

  1. Скрыть сообщение в чем-то брандмауэр позволяет через
  2. Используйте канал связи брандмауэр не контролирует

В случае ранее:

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

В последнем случае:

Вы можете поместить сообщения на скажем файл, в котором какой-либо другой транспортный слой несет им

+0

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

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