Передача файлов UDP в Delphi

Я пишу программу для передачи файлов через локальные компьютеры, давно ищу методы передачи файлов в Delphi. Я обнаружил, что UDP - хорошее решение, но есть проблема: в каждом примере или статье, которые я обнаружил, была клиентская программа рядом с серверной программой, но моя программа должна отправлять и получать на / с каждого компьютера в сети, нет конкретный сервер или клиент, что-то вроде p2p, я не хочу делать компьютер Сервером, а другой - Клиентом, что мне делать? Я тоже искал статьи Indy, он тоже работает в режиме Server / Client (насколько я обнаружил).

введите описание изображения здесь


person Armin Taghavizad    schedule 10.02.2013    source источник
comment
это не означает, что вам нужно программировать, просто вам нужно иметь два компонента в вашей программе, например. TIdUDPClient + TIdUDPServer.   -  person bummi    schedule 10.02.2013
comment
Однако ваш вопрос неясен - если вы хотите отправлять файлы с помощью UDP, что-то должно быть на другом конце, ожидая их получения. Если вы просто хотите скопировать файлы, нет необходимости в UDP или чем-либо еще; вы можете просто копировать файлы между машинами. Можете ли вы объяснить, что именно вы пытаетесь сделать?   -  person Ken White    schedule 10.02.2013
comment
@Ken, я хочу отправить (и, как вы сказали, при каждой отправке что-то должно ждать на другом конце), и проблема именно здесь и для меня, это не всегда отправка computer_A и получение computer_B, иногда B отправляет и A получает, а иногда C отправляет, а B получает, .... поэтому я не могу сказать, что A всегда слушает, а B всегда отправляет, ситуация изменится.   -  person Armin Taghavizad    schedule 10.02.2013
comment
Почему вы хотите использовать UDP? Вам конкретно нужно что-то, что предлагает UDP (например, возможность широковещательной передачи)? Для некоторых приложений UDP является лучшим выбором по сравнению с TCP (например, VoIP), поскольку в нем отсутствует контроль передачи, а сетевые задержки и джиттер могут обрабатываться приложением, но для передачи файлов вам нужен протокол управления передачей. . Если вы сделаете это через UDP, вы наверняка сами перепроектируете весь TCP!   -  person Cosmin Prund    schedule 10.02.2013
comment
@Cosmin, это был отличный совет, спасибо. Нет, в UDP нет особой необходимости, в моих поисках я обнаружил, что с ним проще обращаться. что ты посоветуешь? TCP с Инди? служит ли он тому, что мне нужно (изображение диаграммы, которое я разместил, - это то, что я ищу)   -  person Armin Taghavizad    schedule 10.02.2013
comment
@Armin, UDP проще обрабатывать, если вам нужно отправлять / получать только очень небольшие объемы данных и вы можете жить с ограничением UDP: нет никакой гарантии, что отправляемый вами пакет дойдет до места назначения , нет способа проверить, что это было (если получатель не отправил подтверждение), но это начинает звучать как TCP для бедняков. Вам следует использовать Indy и начать с чего-нибудь простого. Я бы пошел на более высокий уровень, реализовал вещи, используя протокол HTTP: таким образом вы можете использовать браузер для проверки вашего приложения.   -  person Cosmin Prund    schedule 10.02.2013
comment
@Armin, ваша сетевая диаграмма выглядит устрашающе, но в ней нет ничего особенного. В конце концов, вы можете разложить все на два компьютера, которые могут взаимодействовать друг с другом; Ваша диаграмма показывает только то, что один компьютер может разговаривать с 5 другими, но 5 раз повторяется то же самое. Даже одно отношение между двумя компьютерами можно разложить на сценарий клиент-сервер. Один компьютер запрашивает файл у другого, и все. Вы также можете свести сценарий отправки файла к сценарию запроса: пусть отправляющий компьютер попросит другой запросить файл у себя!   -  person Cosmin Prund    schedule 10.02.2013
comment
@Armin: чтобы получить сообщение, каждый компьютер должен прослушивать определенный порт. Включая отправляющий компьютер.   -  person pf1957    schedule 10.02.2013
comment
@Cosmin - я столкнулся с нарушением данных при использовании HTTP и FTP, поэтому я бы не стал утверждать, что TCP очень надежен. Я думаю, что если автор хочет сделать P2P - он должен сделать, как и все современные P2P. Разделите данные на небольшие иерархические блоки и используйте TigerTree Hash для управления передачей. Тогда не будет большой разницы, будет ли основным оператором связи UDP, TCP или даже HTTP (как в G2 P2P).   -  person Arioch 'The    schedule 10.02.2013
comment
Я искал передачу Indy и использовал ее (idTCPSever и idTCPClient) для передачи файлов, я отправляю файл с клиента (idTCPClient) на сервер (idTCPServer), я хочу знать, можно ли также отправить файл с сервера на клиент? или мне нужно использовать как idTCPServer, так и idTCPClient в каждой программе для отправки и получения файлов?   -  person Armin Taghavizad    schedule 17.02.2013


Ответы (2)


Взгляните на компоненты Indy TIdTrivialFTP и TIdTrivialFTPServer. TFTP - это протокол передачи файлов на основе UDP.

person Remy Lebeau    schedule 10.02.2013
comment
FTP не имеет ничего общего с многоадресной рассылкой. И TFTP тоже. TFTP - это совершенно простой протокол «один к одному», очень медленный (ожидающий ACK для любого пакета) и рассчитанный на нехватку аппаратных ресурсов. Ничего общего с вопросом ОП. TCP / IP или даже HTTP (как уровень OCI 7) намного более надежны, чем TFTP, так как они имеют оконное управление, повторную отправку пакетов и множество других надежных средств передачи. - person Arnaud Bouchez; 12.02.2013
comment
@ArnaudBouchez: Ничто в вопросе или комментариях OP не заставляет меня думать, что широковещательная или многоадресная передача действительно желательна. Это то, что вы предполагали, а OP не подтвердил. Фактически ОП описал, сколько P2P-сетей на самом деле работает. Одноранговые узлы решают, кто является клиентом, а кто сервером, и могут при необходимости менять роли, но каждая отдельная передача файла по-прежнему является моделью клиент / сервер в том или ином направлении. Протоколы UDP, такие как TFTP, и протоколы TCP, такие как FTP и HTTP, отлично подходят для этого. Я не сказал, что TFTP был эффективным, просто возможно, учитывая первоначальное желание OP использовать UDP. - person Remy Lebeau; 12.02.2013
comment
@Remy, я новичок в сетевом программировании, не могли бы вы показать мне пример ссылки на использование этих компонентов? - person Armin Taghavizad; 12.02.2013
comment
Использование FTP для межпроцессного взаимодействия, тогда как это протокол удаленного доступа к файлам? Довольно странный вариант, AFAIK. Протокол RESTful / HTTP имеет больше смысла, IMHO - или даже простой TCP / IP с выделенным прикладным уровнем. Если вы посмотрите на диаграмму OP, для меня это звучит как многоадресная рассылка ... каждый узел отправляет на все остальные узлы ... даже если, конечно, для транспортного уровня это всегда точка-точка. - person Arnaud Bouchez; 12.02.2013
comment
@ArnaudBouchez: то, что описал OP, не является трансляцией. Он сказал, что A отправляет B, B отправляет A, C отправляет B. Он не сказал, что A отправляет всем, B отправляет всем и т. Д. - person Remy Lebeau; 13.02.2013
comment
Оп не знал о трансляции, но явно хотел, чтобы моя программа отправляла и принимала на / с каждого компьютера в сети. Что это, кроме многоадресной рассылки? Конечно, комментарий op сбивает с толку, и его вопрос был довольно неясным. На практике программное обеспечение p2p использует как широковещательный, так и клиентский сервер, и они намного сложнее, чем простая передача файлов. - person Arnaud Bouchez; 19.02.2013

UDP может работать в режиме широковещательной передачи, что вам и нужно. Но такие широковещательные рассылки UDP не маршрутизируются за пределы текущей сети (т.е. они блокируются маршрутизаторами), поэтому вам нужно реализовать что-то более сложное, если ваш проект должен быть доступен за пределами основной физической сети.

Не изобретайте велосипед! Если вы хотите увидеть какой-нибудь рабочий источник, реализующий эту концепцию, см. Галактика Ареса:

«Проект самоорганизующейся сети p2p Delphi с широкими возможностями масштабирования и быстрой системой поиска широковещательного типа. Клиент поддерживает передачу файлов из нескольких источников, частичное совместное использование файлов, встроенный аудио / видеоплеер и децентрализованные чаты».

Файлы доступны на SourceForge. Вы можете повторно использовать / адаптировать сетевой уровень P2P для своих нужд, но обратите внимание на условия лицензии исходного кода Ares, если вы используете его в своих проектах.

person Arnaud Bouchez    schedule 10.02.2013
comment
Конечно, он работает в режиме многоадресной рассылки по UDP. Но не также, поскольку он может построить распределенную сеть TCP / IP P2P. - person Arnaud Bouchez; 12.02.2013