Как передать много данных между двумя компьютерами - PullRequest
1 голос
/ 25 августа 2010

Какие возможны варианты для передачи большого количества данных с одного компьютера на другой, не в той же локальной сети.Объем данных составляет около 100 МБ в разархивированном виде и 2 МБ в разархивированном виде?Другое требование заключается в том, что при создании сервера для этого (с C #) клиенты Java должны иметь возможность его использовать.

  • Поддерживает ли WCF что-то подобное?Но если клиенты Java не смогут его использовать, мне это не интересно.
  • Какие здесь могут быть другие стратегии?

Ответы [ 6 ]

2 голосов
/ 25 августа 2010

Я бы просто использовал что-то общее, например, HTTP или FTP, так как для этого будет множество существующих библиотек, и вы гарантированно не будете иметь проблем с совместимостью.2 МБ - это не слишком большой объем данных для этих протоколов.

1 голос
/ 25 августа 2010

Это интересный вопрос. На вопрос довольно просто ответить. Но интересно то, что такого рода вопросы являются новыми, их раньше не было. Позвольте мне объяснить, но сначала я отвечу на ваш вопрос:

Вы должны создать сервер и клиентов, использующих старомодные потоки TCP. Чтобы не ограничивать пропускную способность, вам нужно каким-то образом сжимать поток, здесь используйте один из самых распространенных алгоритмов сжатия, которые вы можете найти (кто-нибудь сказал Zip?). Теперь у вас есть независимый от языка протокол. Клиенты на любом языке будут работать, миссия выполнена. Кроме того, чтобы сохранить кросс-платформенность, не выбирайте лучшее сжатие, выберите наиболее распространенное (оно будет достаточно хорошим).

Теперь, почему такие вопросы интересны, они показывают что-то о ООП в широком масштабе. Люди понимают и используют огромные фреймворки и спрашивают, может ли та или иная фреймворк выполнить для них ту или иную простую задачу. Здесь мы потеряли свои корни, мы потеряли внутреннюю суть вещей, они бьют по гвоздю не молотком, а ядерной ракетой. Это выходит за рамки цели, и это приведет к огромным приложениям, с огромной площадью и часто низкой производительностью.

Я считаю, что количество этих вопросов возросло с тех пор, как ООП была полностью принята. Как будто новые программисты хотят изучать только эти новые большие фреймворки, и что фреймворк затмевает взгляд на мир. В больших фреймворках нет абсолютно ничего плохого, они великолепны, но я считаю, что начинать использовать их до того, как вы освоите основы, будет неправильно. Это все равно, что учиться летать, используя космический челнок НАСА вместо школьной версии частного самолета Cessna.

0 голосов
/ 25 августа 2010

Вы не упомянули, какой тип данных вы хотите отправить. Поэтому для простоты я предполагаю, что у вас есть поток данных, который можно преобразовать в байтовый массив. Содержимое потока должно быть в формате, понятном как для C #, так и для Java!

Лучший выбор - сжать ваш поток данных с потоком GZip. Gzip должен поддерживаться на Java. Затем вы можете отправить этот поток, преобразованный в байтовый массив, в ответ на вашу операцию службы WCF. Вы можете использовать кодировку текста по умолчанию, которая преобразует массив байтов в строку в кодировке Base64. Если ваш Java-клиент поддерживает MTOM (это стандарт, поддерживаемый Java), вы можете использовать кодировку MTOM, которая использует сообщения меньшего размера.

Если у вас нет потока с хорошо известным форматом контента, у вас есть какие-то пользовательские данные. Для пользовательских данных вы должны использовать совместимый транспортный формат, который является XML. Использование XML еще больше увеличит размер ваших данных. В этом случае вам следует подумать о разделении передачи данных на несколько вызовов. Вы также можете попробовать разместить службу WCF в IIS 7.x и воспользоваться ее встроенной функцией - сжатием динамического содержимого. Если ваш Java-клиент вызывает службу с установленным для сжатия заголовком HTTP Accept-Encoding, gzip автоматически сжимает ответ. Помните, что с таким сервисом могут работать только клиенты .NET 4.0 WCF.

0 голосов
/ 25 августа 2010

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

Ссылки по теме (для Java):

0 голосов
/ 25 августа 2010

WCF поддерживает SOAP и включает дополнительную сериализацию JSON для XHTTP. Есть и другие механизмы, но они ориентированы на МС. Вы легко сможете использовать созданный вами сервис. Однако вам придется подумать о том, как кодировать данные, так как они будут подключены к сети недвойственным образом (XML / JSON).

Вместо этого вы можете захотеть создать простой обработчик http, который может возвращать данные напрямую в виде zip-файла с использованием соответствующих заголовков mime и т. Д. Затем вы сможете просто выполнить это, используя свой клиент Java.

0 голосов
/ 25 августа 2010

В C # вы можете сериализовать ваш объект как XML и передать, с другой стороны вы можете десериализовать ваш XML обратно в объект.

С точки зрения размера файлов, вы можете передать как zip или 7z..и на клиенте распаковать его перед анализом XML.

...