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» в качестве ответа
Привет, в вашем псевдокоде ... см. Эту часть «КлиентB делает вызов на сервер GetMessages (« clientB »);« .... Если я использую таймер для этого, он будет потреблять большую пропускную способность на моем сервере правильно? Топология и все абсолютно правильно. Это то, что мне нужно. Но мне нужно выполнить это в сценарии реального мира. – Josh
Итак, я думал, что способ сделать это - позволить клиентам подключиться к серверу и открыть сеанс. и пусть сервер вызывает метод на клиенте через один и тот же сеанс ... Есть ли другой способ? (Я не могу использовать таймер, так как многие клиенты делают это, потребляя всю интернет-пропускную способность моего сервера) – Josh
Что касается полосы пропускания. Используемая ширина полосы будет зависеть от размера объекта сообщения. Большим напряжением будет количество одновременных соединений, это зависит от количества одновременных клиентов. WCF масштабируется очень хорошо, вы должны иметь возможность обрабатывать выделение запроса/сек, и, если нужно, вы можете добавить дополнительные серверы, которые они больше не стоят. Я не знаю, какой тип связи вы хотите сделать, и как высокое/низкое количество запросов на каждый клиент/за каждый таймфрейм. – olle