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事件中編寫如下**:
var buffer: 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事件中新增如下**;
var buffer: 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;這個引數有兩對屬性:
其中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;再編寫如下**:
var buffer: 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位址和埠號;在具體應用中是哪種情況,要根據測試結果而定。
我自己折騰半天,總是報錯,原來是沒有新增udp控制項,這兩個控制項在indy server標籤下,鬱悶啊。折騰一天,原來這原因。
我自己
C 控制項 MenuStrip控制項(選單控制項)
一 概述 選單通過存放按照一般主題分組的命令將功能公開給使用者。menustrip 控制項是此版本的 visual studio 和 net framework 中的新功能。使用該控制項,可以輕鬆建立 microsoft office 中那樣的選單。menustrip 控制項支援多文件介面 mdi ...
隱藏控制項 HiddenField控制項
hiddenfield 控制項hiddenfield 控制項顧名思義就是隱藏輸入框的伺服器控制項 它能讓你儲存那些不需要顯示在頁面上的且對安全性要求不高的資料。也許這個時候應該有這麼乙個疑問,為什麼有了 viewstate session 和cookie 等狀態儲存機制,還需要用起 hiddenfi...
標籤控制項 CTableCtrl 控制項
前言 區別 ctablectrl和cpropertysheet.乙個是控制項,另乙個是對話方塊屬性類 目錄 0.訊息彙總 1.常用方法總結 0.訊息彙總 1.常用方法總結 定義視窗資源以及和類進行相關繫結物件兩個,標籤控制項新增兩個子項.建立視窗,設定相關區域,移動視窗.原始碼 m tab.inse...