Передача двоичных данных с использованием сокетов? - PullRequest
2 голосов
/ 22 мая 2011

Я подумываю о создании серверного / клиентского приложения, которое сделает это: клиент (ы) подключится к серверу, а сервер отправит обратно список папок (возможно, музыку или видео), которые клиент сможетстрим или скачать.Я собираюсь сделать графический интерфейс для этого, чтобы он не был текстовым интерфейсом.Я хочу, чтобы, когда клиент подключается к серверу и получает информацию о медиа-файлах, которые можно передавать / загружать, клиент будет показывать папки / файлы в интерфейсе, похожем на проводник (папки будут отображаться со значком папки.видео будут отображаться со значком видео и т. д.)

Это кажется мне очень большим, но я действительно хочу узнать больше о программировании сокетов на C # и почувствовать, что действительно грязные руки - лучший способ.Как вы можете себе представить, у меня много путаницы по поводу того, как начать это и что мне нужно сделать, чтобы сделать эту работу.

Первая часть моего вопроса: если я хочу датьклиент получает список файлов / папок, а также имеет возможность загружать / передавать их в потоковом режиме. Нужно ли что-то делать с передачей двоичных данных с помощью сокетов или я совершенно не прав?Если я не прав, нужно ли мне использовать что-то еще, например, средства чтения файлов, и каким-то образом использовать их поверх сокетов?

Вторая часть моего вопроса: когда я передаю эту информацию клиенту, как я могузаставить клиента показывать соответствующие значки для видео, папок, mp3 и т. д.?Я думаю, что если мне придется передавать двоичные данные, мне придется использовать эти данные, чтобы каким-то образом заполнить клиентский графический интерфейс правильными значками / данными.Я застрял на том, как именно справиться с этим.Существуют ли определенные методы / классы, которые я могу использовать, чтобы проанализировать эти данные и сделать то, что я хочу с ними сделать?Опять же, я не знаю, ошибаюсь ли я в необходимости передачи двоичных данных, но в любом случае я запутался в том, что необходимо для этого сделать.

Я прошу прощения, если какая-либо из моих терминов неверна.Я, очевидно, еще не эксперт в C #;)

Ответы [ 2 ]

3 голосов
/ 22 мая 2011

Каждый раз, когда вы отправляете данные между машинами (или между процессами), вы уже говорите двоичные данные (вы можете утверждать, что все - это двоичные данные, но при работе с ним как с моделью ОО это нене хочется)Дело в том, что все, что вам нужно сделать, это сериализовать ваши сообщения .Существует множество фреймворков сериализации - некоторые нацелены на удобство, некоторые нацелены на диапазон функций, и сом может использовать нацеленность на производительность (минимальная пропускная способность и т. Д.).

Даже встроенные будут работать - например,вы можете использовать XmlSerializer и т. д. для записи в Stream (например, NetworkStream, который вы обычно используете с сокетом).Но, пожалуйста - не BinaryFormatter (это будет больно, честно).Лично я бы использовал что-то немного менее многословное, такое как protobuf-net, но я несколько предвзят, поскольку написал это; p

Однако учтите, что при работе с сокетами вы обычно отправляете несколько) сообщения как часть разговора.Чтобы каждый конец правильно и удобно считывал правильные данные на сообщение из потока, обычно префикс каждого сообщения имеет длину (количество байтов) - например, в порядке байтовint с фиксированными 4 байтами.Итак, процесс чтения:

  • чтение 4 байта
  • интерпретировать это как int, скажем n
  • чтение n байтов
  • запустите эти данные через десериализатор, возможно, через MemoryStream
  • обработайте сообщение

, и процесс отправки может быть:

  • сериализовать сообщение, возможно, к MemoryStream
  • запросу длины и сформировать 4-байтовый префикс
  • записать префикс
  • записать данные
2 голосов
/ 22 мая 2011

Вам не нужно переходить на столь низкий уровень, как Socket, если вы просто не хотите изучать, конечно.

Я предлагаю использовать WCF.Он будет полностью соответствовать вашим требованиям, будет гибким, и вам не придется иметь дело с сокетами напрямую.

WCF - это большая структура, но вы можете быстро научиться ее использовать.

Введение в WCF

Здесь вы можете найти, как получить и показать значок файла в Windows.
Если ваш клиент размещен наWindows, вам не нужно передавать значки, вы можете просто получить изображение на клиенте по имени файла / расширению.

...