Должен ли я использовать WCF или необработанные сокеты? - PullRequest
8 голосов
/ 24 июля 2010

Я хочу разработать клиент-серверное приложение в .NET, которое функционирует следующим образом:

  1. Клиенты подключаются к центральному серверу.Сервер должен отслеживать, какие клиенты подключаются, и он должен разрешать только те, которые ему известны (у меня есть хранилище разрешенных клиентов).Это потому, что в моем приложении важно знать, кто все присутствует в данном экземпляре.
  2. Клиенты могут быть подключены к некоторым другим устройствам, например, через порты LAN / USB / Serial.Сервер должен иметь возможность управлять этими подключенными устройствами через клиента.Например, предположим, что клиент подключен к камере.Сервер должен иметь возможность включить камеру в определенное время, а затем вернуть изображения (или заставить клиента сделать это и загрузить результат на сервер).
  3. Мне также хотелось бы, чтобы была возможностьэти клиенты запускают пользовательский исполняемый файл и получают результат.Например, сервер отправляет приложение (или вызывает некоторые из существующих) в клиенте, заставляет его запустить его и возвращает полученные данные.

Мне просто интересно, смогу ли яиспользуйте WCF для этой цели, или я должен пойти с хорошими старыми сокетами.Хотя первоначальная сеть будет небольшой, я хочу, чтобы она масштабировалась (тысячи клиентов).Любое предложение будет с благодарностью.

Ответы [ 4 ]

2 голосов
/ 10 октября 2011

Я просто делал то же самое.Я написал сервер на основе TCP, который может легко обрабатывать 1000 одновременных клиентских подключений за час и завершиться 80 строками кода.Я потратил несколько дней, пытаясь и не мог заставить дуплексный сервер WCF сделать то же самое.Потребовалось 175 строк кода, чтобы заставить дуплексный сервер и клиент WCF работать вообще, и он вылетает, если 30 клиентов пытаются подключиться одновременно.

Так что я должен не согласиться с другими ответами здесь: я обнаружил, что WCFабсолютная катастрофа и сырые розетки, чтобы быть намного проще и надежнее.

2 голосов
/ 24 июля 2010

Сегодня я бы никогда не опустился до такого низкого уровня, как сокеты, если бы вам не пришлось этого делать. Работа с абстракциями высокого уровня намного продуктивнее и креативнее. Лучше потратить 2-3 дня на изучение WCF или .Net Remoting, а затем 2 недели на отладку низкоуровневых сокетов.

У нас было похожее решение сделать несколько недель назад. Мы решили использовать Remoting, так как вы можете работать на уровне объектов, это чертовски просто в настройке и довольно эффективно. Мы могли бы использовать WCF, но это было не так просто настроить.

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

Предположим, вы написали абстракцию для вашей камеры, например:

class Camera
{
    public CompressedImage GetFrame()
    {
        ....
        return image;
    }
}    

Затем вы можете создать удаленный объект на сервере и написать что-то вроде:

var cam = SomeClientObject.GetCamera(); //get proxy object for the cam
....
var frame = cam.GetFrame();

, который вызовет метод GetFrame () на клиенте и передаст вам изображение через (меж) сеть, если изображение сериализуемо. Единственное, что вы должны иметь в виду, это то, какие объекты создают прокси на другой стороне, а какие объекты копируются на другую сторону.

Это действительно мощно и работает для нас как очарование. Так что освободите свой разум от розеток:)

1 голос
/ 24 июля 2010

Я согласен, сокеты очень низкого уровня - но из вашего описания проблемы, похоже, что вы хотите, чтобы сервер инициировал связь с клиентами в дополнение к обычному взаимодействию клиент -> сервер (т.е. инициирован клиент). Я также новичок в WCF и знаю, что WCF поддерживает дуплексную связь. Но мой GUESS заключается в том, что когда клиент делает запрос, он также передает функцию обратного вызова, которую сервер может вызвать. Таким образом, модель все еще клиент -> сервер, за которым следует сервер, вызывающий обратный вызов.

Инициированная сервером связь с WCF - это то, о чем я не знаю . Таким образом, вы можете проверить это, прежде чем принять решение о любом из двух.
Вы также можете рассмотреть комбинацию обоих, как, например, WCF для большинства сценариев, и отдельную обработку потоков Socket Communication для тех случаев, когда WCF не подходит / не возможен.

Спасибо
VM

0 голосов
/ 25 июля 2010

Вы можете использовать WCF.Это позволяет вам делать обратные вызовы клиенту.начните здесь: http://idunno.org/archive/2008/05/29/wcf-callbacks-a-beginners-guide.aspx

И я также согласен с другим ответом: гораздо более продуктивно тратить несколько дней на оценку WCF, чем переходить на сокеты.В будущем вам нужно будет получить много функций, отсутствующих в сокете, поэтому вам нужно будет реализовать их самостоятельно.В то время как WCF предоставляет их из коробки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...