DELPHI中兩個UDP控制項的用法

2021-05-23 11:06:48 字數 3883 閱讀 8476

delphi

中有兩個

udp控制項:

tidudpserver

和tidudpclient

控制項,可用於傳輸

udp資料;用法都很簡單,主要是一些細微的特性,弄清楚了對正確使用這兩種控制項有很大的好處;下面分別介紹:

一、tidudpserver

:代表乙個

udp的服務端,接收

udp客戶端發過來的資料;在

form

上放置乙個

tidudpserver

控制項,命名為

udpsvr

,在formcreate

事件中編寫如下**:

udpsvr.bindings.add;

udpsvr.bindings[0].ip := 『192.168.2.117』;

udpsvr.bindings[0].port := 1812;

udpsvr.active := true;

在udpsvr

控制項的onudpread

事件中編寫如下**:

varbuffer: array[0..1024] of char;

isize: integer;

sdata: string;

begin

zeromemory(@buffer,sizeof(buffer));

isize := adata.size;

if isize > 1024 then

begin

isize := 1024;

end;

adata.seek(0,sofrombeginning);

isize := adata.read(buffer,isize);

。。。。。

end;

這樣就完成了乙個可以接收資料的

udp應用程式;

其實tidudpserver

有傳送資料的方法:

send

和sendbuffer

,是繼承自

tidupdbase

,所以只要利用

tidudpserver

控制項就可完成資料的收發,在

form

上新增乙個

tbutton

控制項,在

click

事件中新增如下**;

varbuffer: array[0..1024] of char;

stext: string;

ilen: integer;

begin

stext := 『12345678』

zeromemory(@buffer,sizeof(buffer));

strpcopy(buffer,stext);

ilen := length(stext);

udpsvr.sendbuffer(『192.168.2.117』,1814,buffer,ilen);

end;

這樣就可以向另一

udp應用程式傳送資料;

乙個tidudpserver

控制項可以開啟多個埠,如下的**開啟了兩個埠:

udpsvr.bindings.add;

udpsvr.bindings[0].ip := getlocalip;

udpsvr.bindings[0].port := 1812;

udpsvr.bindings.add;

udpsvr.bindings[1].ip := getlocalip;

udpsvr.bindings[1].port := 1813;

udpsvr.active := true;

當開啟多個埠時,傳送資料是從哪個埠傳送出去呢?根據測試結果是:最近收到資料的那個埠;如果還沒有收到過資料,則為

bindings[0].port;

在接收資料的事件中,有乙個

tidsockethandle

型別的引數:

abinding

;這個引數有兩對屬性:

ip 、

port

:代表本地

ip位址和埠;

peerip

、peerport

:代表遠端

ip位址和埠;其中

peerip

、peerport

在交**送資料的

udp應用中是很有用的,因為

udp服務端可以向

peerip

和peerport

回應資料,而不用再去設定

udp客戶端的

ip位址和埠號(這種方法應用不當,會產生問題,下面會說到);

二、tidudpclient

:代表乙個

udp的客戶端,專門用於傳送

udp資料,不能接收資料,因為沒有相應的事件和方法;前面已經說過,利用

tidudpserver

控制項就可以完成

udp資料的收發,所以一直懷疑

tidudpclient

控制項存在的必要性;除非有乙個

udp的客戶端只傳送資料,而從不接收資料,這樣的客戶端應該很少;後來我想,可能可以用

tidudpclient

控制項來分擔

tidudpserver

控制項的負載,在乙個需要收發大量

udp資料的服務端中,

tidudpserver

控制項只接收資料,另外專門用乙個

tidudpclient

控制項傳送資料,也許可以提高應用程式的效能(沒有經過驗證);利用

tidudpclient

傳送資料有兩種方式:

1、利用

tidudpclient

控制項本身的

send

和sendbuffer

方法,這時需要設定

host

和port

屬性,在

form

上放置乙個

tidudpclient

控制項,命名為:

udpclt

;分別設定

host

和port

屬性值為:

192.168.2.117

和1814

;再編寫如下**:

varbuffer: array[0..1024] of char;

stext: string;

ilen: integer;

begin

stext := 『12345678』;

zeromemory(@buffer,sizeof(buffer));

strpcopy(buffer,stext);

ilen := length(stext);

udpclt.sendbuffer(buffer,ilen);

end; 2、

不需要設定

host

和port

屬性,而直接利用從

tidupdbase

繼承來的

send

和sendbuffer

方法,也可傳送資料,**如下所示:

udpclt.sendbuffer(『192.168.2.117』,1814,buffer,ilen);

tidudpclient

控制項傳送資料時是通過哪個埠發出去的呢?根據測試的結果:是隨機的;這樣就給上面說過的

udp服務端可以向

peerip

和peerport

回應資料造成了麻煩,也就是說如果

udp服務端收到的資料是通過

tidudpclient

控制項發過來的,就不能通過

peerip

和peerport

回應回去,而應設定客戶端的

ip位址和埠號;在具體應用中是哪種情況,要根據測試結果而定。

Delphi2009的兩個包

1 graphic32 這個處理圖形的庫,已經停止一段時間了,但是也有跟蹤使用的,現在已經有2010版本了,所以graphic32.d2010 已經存在了,編譯安裝,注意安裝設計庫時比較依賴執行庫,注意設定路徑。本執行庫可以簡單開發2d遊戲和影象處理,詳見 2 businessskinform v7...

delphi 兩個有意思的函式

此函式可以用variant返回多個欄位的值 function tdataset.getfieldvalue const fieldname string variant vari integer fields tlist begin if pos fieldname 0 then begin fie...

delphi計算兩個時間差

uses dateutils vars1,s2 string t1,t2 tdatetime d,h,m,s integer value int64 begin s1 2015 09 23 15 44 50 s2 2013 09 22 16 47 51 t1 strtodatetime s1 t2 ...