На этом шаге мы рассмотрим основные свойства, методы и события компонента TNMUDP.
Компонент TNMUDP используется для отправки пакетов по Интернет или интранет с использованием протокола UDP (User Datagram Protocol), протокола пользовательских датаграмм. Стандарт протокола описан в RFC 768.
Перед тем, как отправлять пакеты датаграмм, вам нужно задать имя удаленного компьютера и порт, на которые вы будете посылать данные. Эти значения нужно присвоить свойствам RemoteHost и RemotePort соответственно. Далее можно отправлять данные одним из двух методов: метод SendBuffer отправляет на удаленный компьютер массив символов (или буфер данных), а метод SendStream занимается отправкой потоков данных. Для получения данных нужно указать значение для свойства LocalPort. Это свойство задается во время разработки и не может быть изменено во время выполнения, кроме случая, когда компонент создается динамически, с помощью метода Create. В последнем случае свойству LocalPort присвоить значение можно только один раз. Когда данные поступили и их можно использовать, происходит событие OnDataAvailable. В обработчике этого события вы можете вызвать метод ReadBuffer и считать данные в буфер или метод ReadStream, чтобы поместить данные в поток. Упомянем еще свойство ReportLevel, которое определяет степень детализации, с которой событие OnStatus выдает свой отчет. Значение по умолчанию Status_Informational. В качестве значений свойства могут выступать только следующие предопределенные константы:
Теперь о методах этого компонента.
Метод ReadBuffer считывает приходящие датаграммы и помещает их в буфер. У метода есть два параметра: параметр Buff задает буфер, в который помещаются данные, второй параметр length - размер данных. Нужно следить за тем, чтобы размер буфера был достаточен для размещения поступающих данных. Если вы попытаетесь записать в буфер данных больше, чем он может вместить, то произойдет ошибка доступа к памяти.
Метод ReadStream читает полученные от удаленного компьютера датаграммы и помещает их в поток. Параметр DataStream задает инициализированный поток типа TStream или его потомка. Если параметр ссылается на поток, который не был инициализирован (не выполнили метод Create), возникнет ошибка доступа к памяти.
Отправляют данные методы SendBuffer и SendStream. Первый применяется для отправки на сервер порции данных, записанных в буфер. У этого метода та же пара параметров, что и у метода ReadBuffer. Если в массиве Buff нет данных, будет сгенерировано событие OnBufferInvalid. Метод SendStream отсылает поток на удаленный компьютер. Если поток DataStream не содержит данных, произойдет событие OnStreamInvalid.
Событие OnBufferInvalid генерируется, когда метод SendBuffer получает в качестве параметра массив, не содержащий данных. Обработчик события получает через параметр Buff массив, который нужно отправить, а через параметр length - размер отправляемых данных. Эти значения можно исправить, установить параметр handled в True и переслать буфер вторично. Если значение handled равно False (значение по умолчанию), то будет возбуждаться исключительная ситуация. Событие OnStreamInvalid происходит, когда в потоке, переданном методу SendStream, нет данных. Через параметр Stream обработчика этого события передается поток, в котором отсутствуют данные. Вы можете заполнить его необходимыми данными. После этого, если параметр handled имеет значение True, то делается еще одна попытка отправить поток. Если параметр handled равен False, возбуждается исключительная ситуация.
Событие OnDataReceived генерируется, когда получены данные от удаленного компьютера. Обработчик события имеет три параметра: в параметре NumberBytes задается количество пришедших байт данных, в параметре FromIP указывается IP-адрес компьютера, который прислал эти данные, и в параметре Port - порт, по которому отправляет свои датаграммы этот удаленный компьютер.
Событие OnDataSend наступает, когда данные успешно отправляются методом SendStream или методом SendBuffer. Нужно заметить, что если произошло событие OnDataSend, означающее успешную отправку данных, то это не гарантирует, что данные действительно будут получены удаленным компьютером. Вызвано это тем, что сам протокол UDP не поддерживает контроль доставки данных.
Событие OnInvalidHost генерируется, если в свойстве RemoteHost сервер указан неправильно.
Событие OnStatus происходит, когда меняется статус компонента.
На следующем шаге мы рассмотрим пример использования этого компонента.