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 ...