24h購物| | PChome| 登入
2009-04-02 14:37:08| 人氣2,570| 回應1 | 上一篇 | 下一篇

[轉貼]VCL InterNet 元件篇(TServerSocket,TClientSocket)-介紹

推薦 0 收藏 0 轉貼0 訂閱站台

元件名稱:TServerSocket,TClientSocket
文件版本:for Delphi
文件作者:Delphi K.Top 討論區站長 (http://delphi.ktop.com.tw)
http://delphi.ktop.com.tw/board.php?cid=169&fid=957&tid=20274


●[元件簡介]
這兩個元件是成雙成對的,採用UDP的通訊協定,一個在Server端使用,一個在Client端使用,可以用來寫線上聊天室軟體,Delphi K.Top網站的DelphiChat軟體就是用此元件組完成的,但是筆者也曾經用來寫線上的遊戲,如連線下棋...等.

通常我們在主機端執行TServerSocket,執行後主機的IP Address就是Client端要連上的IP Address,而在TServerSocket中Port屬性設定的Port值就是Client端要連上的Port,在Client端電腦使用TClientSocket,設好它的Host與Port屬性值後,就可以用Active:=True連上主機.

●[重要屬性]
TServerSocket.Active:
設定為True代表打開主機端的通訊,最好不要在設計階段打開此屬性,要在執行階段打開,例如:在Form的Create事件中.

TServerSocket.Port:
用來設定通訊所用的Port,要注意TClientSocket的Port要與主機的port一樣,還有像FTP採用UDP port 21、某些通訊軟體會有固定使用的port,不要與這些程式衝突了,Delphi內附的Chat範例程式採用1024 port供您參考使用.

TClient.Active:
設定為True代表打開Client端的通訊,最好不要在設計階段打開此屬性,最好在執行階段打開,例如:在Form的Create事件中,還有設為True後通訊不會立刻打開,所以不可設為True後馬上傳資料.

TClientSocket.address:
填上主機的網址,如:delphi.ktop.com.tw,不要加http喔!

TClientSocket.host:
填上主機的IP Address,如:xxx.xxx.xxx.xxx,也是不要加http,若您的Server與Client都在同一台,您可以填上127.0.0.1用來做單機的測試,還有address屬性與host屬性是二選一的,設定其中一個就好.

TClientSocket.Port:
通訊所用的Port,要注意TClientSocket的Port要設得與主機的port一樣.

●[重要事件]
TClient.OnClientConnect:
當有一個Client連上時會呼叫此事件,參數(Socket: TCustomWinSocket)會傳回Client的Socket通道資訊,您可以用Socket.SocketHandle得到這個通道的編號(是一個數值),您可以將它存起來,將來主機可以用TServerSocket.Socket.Connections[n].SocketHandle來判斷是那一個Client connection,然後再用TServerSocket.Socket.Connections[n].SendText(string)送資料給指定的Client端.

TServerSocket.OnClientDisConnect:
當有一個Client端終止通訊時會呼叫此事件,您可在此用Socket參數來判斷是那一個Client離線.

TServerSocket.OnClientError:
當有一個Client端通訊發生錯誤時會呼叫此事件.

TServerSocket.OnClientRead:
當有一個Client端送資料給主機時會呼叫此事件,您可用Socket.ReceiveText來取出送來的資料.

TClientSocket.OnConnect:
當Client端成功連上主機後會呼叫此事件,您可在此設定一個旗標,旗標設定後才可開始一切的通訊.

TClientSocket.OnDisConnect:
當Client當與主機斷訊時會呼叫此事件.

TClient.OnRead:
當主機送來一筆資料時會呼叫此事件,您可用Socket.ReceiveText來取出送來的資料,還有若主機端連續送來的兩筆資料時間間隔太短,有可能兩筆資料會被合併成一筆,這點在設計通訊程式時要特別注意.

●[重要方法]
ServerSocket.Active := True;//打開主機通訊
ClientSocket.Active := True;//打開Client端通訊
ServerSocket.Socket.ActiveConnections // 連上主機端的Client總數
ServerSocket.Socket.Connections[i] // 連上主機端的Client通道資訊
ClientSocket.Socket.SendText('ABC'); // Client端送訊息給主機
//以下方法可從主機傳訊息給所有的Client端
for i:=0 to ServerSocket.Socket.ActiveConnections-1 do
begin
    ServerSocket.Socket.Connections[i].SendText('ABC');
end;

●[使用經驗]
若您的Server端有防火牆必需把UPD所用的Port開放出來,Client端才可以連的上,至於Client若有使用防火牆時,若為一般簡易的IP分享器為鎖進不鎖出,即使UPD的Port未開放,Client端還是可以順利連上主機,若為大企業用的高等FireWall時,UPD的Port未開放,Client有可能無法連上主機!

台長: kk_july
人氣(2,570) | 回應(1)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: 程式設計 |
此分類下一篇:[轉貼]VCL InterNet 元件篇(TServerSocket,TClientSocket)-程式

印度神油
2020-01-13 03:34:47
是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文