![]() |
[COLOR="LemonChiffon"]
Пример использования компонента Indy UDP Server Статья рассчитана для начинающих Delphi программистов и содержит базовую информацию о применении компонента idUDPServer в своем приложении. Предполагается, что рабочая среда пользователя - Delphi 7й версии с установленными по умолчанию компонентами Indy. Компонент idUDPServer предназначен для работы с сетевым протоколом UDP. Может быть использован как в роли клиента так и сервера. Существует и компонент idUDPClient, являющийся, по сути подобием idUDPServer с урезанным функционалом, что означает рациональность употребления idUDPServer в любых случаях. Для начала, после запуска Delphi в режиме создания нового форменного приложения ищем на палитре Indy Serversкомпонент idUDPServer и размещаем его в любом месте формы, как любой иной невизуальный компонент. http://178.124.145.124/art/idudps/idudps1.png Хотя, реально и совершенно бесформное включение компонента. У компонента имеется 2 основные процедуры, которые и обеспечивают его работу по вводу-выводу работы с UDP. Это Send(AHost: string; const APort: Integer; const AData: string) и IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle). Процедура Send, как можно догадаться по названию, отправляет наши данные (AData) по указанным в ней адресу (AHost), порту (APort). Более для отправки ничего настраивать не требуется. Пример отправки данных из Edit: Код:
procedure TForm1.Button2Click(Sender: TObject);Если наш сервер активен, то при поступлении на указанный IP и порт пакета UDP будет выполнена процедура/событие IdUDPServer1UDPRead, в поток AData которой будет помещено содержимое пакета. Прочитать данные из потока в строковую переменную text поможет следующий код: Код:
MemStream:= TMemoryStream.Create;Пример приема данных с игрового сервера (мастер-сервера) с последующим парсингом и выводом (принимается список IP адресов в HEX формате): [CODE] procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); var text,iptext:string; MemStream: TMemoryStream; n,ofs:cardinal; begin text:=''; try MemStream:= TMemoryStream.Create; MemStream.LoadFromStream(AData); MemStream.Position:=0; SetString(text, nil, MemStream.Size); //читаем содержимое в строку MemStream.Read(Pointer(text)^, MemStream.Size); MemStream.free; except end; iptext:=''; ofs:=7; text:=StringReplace(text,'\EOT','\',[rfReplaceAll , rfIgnoreCase]); //мы знаем, что должно поступить и начинаем разбор, здесь - замена for n:=1 to length(text) do //ищем фрагменты с IP в HEXе begin case ofs of 1..3 : iptext:=iptext+IntToStr(cardinal(text[n]))+'.'; 4 : iptext:=iptext+IntToStr(cardinal(text[n]))+':'; 6 : iptext:=iptext+IntToStr(StrToInt('$'+IntToHex(card inal(text[n-1]),2)+IntToHex(cardinal(text[n]),2)))+#13+#10; //выбираем сам IP-шник end; if ((text[n]='\') and (ofs=7)) then ofs:=1 else if ofs |
| Время: 17:06 |