Могу ли я использовать UDPClient и UDPServer в Delphi для отправки большого количества данных?

Прежде всего, я намерен создать сервер и клиент 2 программ для отправки большого массива байтов. Я только начал тестировать компоненты UDPclient и udpserver. Я не верю, если это правильно.

Я нашел пример программы, но он был построен со старой версией Delphi, при компиляции я получаю сообщение об ошибке.

HostName.Caption := UDPServer.LocalName;
HostAddress.Caption := GStack.LocalAddress;
Port.Caption := IntToStr(UDPServer.DefaultPort);
BufferSize.Caption := IntToStr(UDPServer.BufferSize);
UDPServer.Active := True;

похоже udpserver.localname было в старых версиях. Мне нужно найти здесь, какую собственность использовать. Как получить и записать имя хоста в компонентах udpserver. udpclient имеет свойство Host и работает нормально, я могу скомпилировать клиентскую программу

Может ли кто-нибудь помочь мне, что поставить вместо свойства "localname"

И если кто-нибудь может посоветовать мне другой способ отправки больших массивов байтов. размер будет около 1 20000. Я пришлю его каждую минуту

Спасибо


person Samir Memmedov    schedule 03.06.2012    source источник
comment
Почему вы используете UDP вместо TCP?   -  person FHannes    schedule 03.06.2012
comment
Я не знаю, у меня нет конкретной причины, просто начал с UDP   -  person Samir Memmedov    schedule 03.06.2012
comment
Сначала изучите разницу между UDP и TCP. В UDP у вас нет гарантии, что вы получите отправленный пакет, и порядок полученных пакетов может отличаться от отправленного. UDP обычно используется в протоколах реального времени (таких как VOIP, игры и т. Д.). Если это не является обязательным условием, я настоятельно рекомендую вам выбрать маршрут TCP, так как его намного проще изучить ...   -  person whosrdaddy    schedule 03.06.2012
comment
Это не в реальном времени, он будет отправлять данные часто раз в минуту, и будет около 10 клиентов. Хорошо, спасибо за совет. Посмотрю ПТС. Спасибо, ребята, за ответы   -  person Samir Memmedov    schedule 03.06.2012


Ответы (3)


Лучше всего использовать TCP, поскольку он может обнаружить повреждение данных в вашей передаче и снова запросить поврежденные пакеты. Обнаружение происходит путем проверки пакетов на соответствие 16-битной контрольной сумме, при этом будут обнаружены только ошибки, но не позволять системе исправить это, и здесь снова возникает запрос данных.

Вероятно, наиболее удобно использовать библиотеку сокетов Indy, поставляемую с Delphi, для создания сокетов TCP. Компоненты TIdTCPServer и TIdTCPClient должны хорошо выполнять свою работу.

Вы можете найти некоторые демонстрации использования библиотеки Indy здесь:

person FHannes    schedule 03.06.2012
comment
Ваше второе предложение может относиться либо к UDP, либо к TCP, либо к обоим. Это очень непонятно. В любом случае ни TCP, ни UDP не используют биты четности, они используют 16-битную контрольную сумму. - person user207421; 04.06.2012
comment
@EJP Вы правы, моя беда, прошло много времени с тех пор, как я прошел вводный курс по сетевым протоколам в колледже. - person FHannes; 04.06.2012

GStack.HostName заменяет старое свойство LocalName.

UDP - это транспорт на основе сообщений. 120000 - это слишком много байтов, чтобы поместиться в одно сообщение UDP. Вам придется разбить его на небольшие куски. Чтобы отправлять большие объемы данных с помощью UDP, рассмотрите возможность использования протокола передачи на основе UDP, например TFTP. В Indy есть TIdTrivialFTP и TIdTrivialFTP компоненты для этой цели.

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

person Remy Lebeau    schedule 04.06.2012

Это зависит от данных, которые вы пытаетесь отправить по сети. Если вы хотите отправить файл по сети, вам следует использовать протокол TCP, поскольку он гарантирует, что данные, полученные на стороне сервера, будут такими же, как отправленные на стороне клиента. Если данные, которые вы хотите отправить, с потерями, как голос (я имею в виду, что это не важно, у нас есть задержки или потери в середине и в данных), вы можете использовать протокол UDP. Это будет намного быстрее, потому что у него нет накладных расходов на проверку данных на наличие повреждений. В UDP вы можете потерять свои пакеты или датаграммы, поэтому UDP называется протоколом без подключения, потому что на самом деле нет подключения. Я думаю, что все известные языки программирования поддерживают соединения TCP и UDP.

person Kamran Amini    schedule 04.06.2012