Хорошо, упомянутые вами системы работают следующим образом. Сначала они пытаются заставить клиента A и клиента B взаимодействовать напрямую через ряд различных топологий, которые, в основном, требуют, чтобы одна из них разрешала входящие соединения, в случае неудачи они обращаются к третьей стороне, которая действует как человек посередине. Таким образом, клиент A обращается к серверу и отправляет ему сообщения для клиента B. Затем клиент A получает в ответ сообщения, адресованные ему. Клиент B отправляет ему сообщения на сервер, и он получает сообщение от клиента A обратно с сервера. Таким образом, и клиент A, и B всегда инициируют соединение и не нуждаются в открытом порту для входящего трафика.
Если я правильно понимаю, в вашем случае вы бы всегда хотели, чтобы человек посередине. Для этого вам нужно написать сервис WCF, который предоставляет все соответствующие методы. Например, такие вещи, как
- void SendMessageToClient (идентификатор отправителя, идентификатор получателя, сообщение сообщения)
- Сообщение [] GetMessages (Guid receientId)
затем эти методы соответственно сохраняют и извлекают эти объекты сообщения откуда-то (например, из базы данных, очереди или чего-то в этом роде).
Затем напишите клиент, который подключается к службе WCF, используя HTTP-привязку, и вызовите методы на сервере и обработайте результаты.
Надеюсь, вы понимаете, что
- а) это не очень эффективный способ общения.
- b) , что сложно тестировать, отлаживать и понимать, что происходит, так как вовлечено так много сторон, и связь асинхронна, живя в 3 разных процессах.
- в) он добавляет дополнительный уровень поверх связи, поэтому вам нужно держать его в голове (и предпочтительно в коде), когда вы имеете дело с битами инфраструктуры и когда вы Имея дело с действующим протоколом clientA и clientB общаются друг с другом в объектах Message.
Псевдо (код) Пример
в этом примере я предполагаю, что объект сообщения является не чем иным, как строкой, и единственной командой является «whattimeisit», на который ответом является местное время в виде строки
- ClientA выполняет вызов к серверу. SendMessageToClient ("clientA", "clientB", "whattimeisit");
- Сервер сохраняет это сообщение в базе данных с идентификатором 1
- ClientB выполняет вызов к серверу GetMessages ("clientB");
- Сервер получает сообщение с идентификатором 1
- ClientB получает обратно «whattimeisit» в качестве ответа
- ClientB выполняет вызов к серверу. SendMessageToClient ("clientB", "clientA", "19:50:12");
- Сервер сохраняет это сообщение в базе данных с идентификатором 2
- ClientA выполняет вызов к серверу GetMessages («clientA»);
- Сервер получает сообщение с идентификатором 2
- ClientA получает обратно «19:50:12» в ответ