基於TCP的Socket連接【Delphi版】


基於TCP的Socket連接【Delphi版】

 

一、Server端

   使用的indy控件:

idtcpsrvr1: TIdTCPServer;

   a)設置默認端口

1 begin
2 Self.btn1.Enabled:=False;
3 idtcpsrvr1.DefaultPort:=2001;
4 idtcpsrvr1.Active:=True;
5 end;

   b)對客戶端連接事件響應

復制代碼
1 procedure TForm1.idtcpsrvr1Connect(AThread: TIdPeerThread);
2 var
3 ipStr:string;
4 begin
5 ipStr:=AThread.Connection.Socket.Binding.PeerIP;
6 ShowMessage('IP地址為: '+ipStr+' 的用戶連接過來!');
7 end;
復制代碼

   c)對客戶端發送過來的字符串進行顯示,並通知客戶端接收成功

復制代碼
 1 procedure TForm1.idtcpsrvr1Execute(AThread: TIdPeerThread);
2 var
3 str:string;
4 begin
5 with AThread.Connection do
6 begin
7 str:=readln('',5000);
8 inc(messageId);
9 WriteLn('第'+inttostr(messageId)+'條數據接收成功,內容為:'+str);
10 end;
11 end;
復制代碼

 

二、Client端

Socket:TIdTCPClient;

   a)指定Server端ip和端口號

1 begin
2 Socket := TIdTCPClient.Create(nil);
3 Socket.Host:='127.0.0.1';
4 Socket.Port:=2001;
5 end;

   b)建立連接

復制代碼
 1 if not socket.Connected then
2 begin
3 try
4 socket.Connect(5000);
5 Memo1.Lines.Add('socke連接已經成功建立!');
6 btn1.Caption:='斷開連接';
7 except
8 ShowMessage('連接失敗,請檢查連接設置!');
9 end;
10 end
復制代碼

    注:socket連接建立失敗的兩種情形:
        1)探測找不到目標主機:此時會等到timeout時間結束后,拋出連接異常
        2)探測到目標主機,但是目標主機上socket連接未開:立即拋出連接異常

  c)發送與接收數據

復制代碼
 1 var
2 RequestStr,BackStr:string;
3 begin
4 if socket.Connected then
5 begin
6 RequestStr:='tttttttttttt';
7 try
8 socket.WriteLn(RequestStr);
9 Memo1.Lines.Add('發送數據:'+RequestStr);
10 BackStr:=socket.ReadLn('',5000); //實際上timeout是不起作用的,indy本身
11 //的bug;此時如果server端無數據則會死等
12 Memo1.Lines.Add('返回數據:'+BackStr);
13 except
14 ShowMessage('發送數據失敗!');
15 end;
16 end
17 else
18 begin
19 Memo1.Lines.Add('連接已被斷開,無法發送!');
20 end;
21 end;
復制代碼

 

   說明:1)indy的TIdTCPClient是阻塞式的,程序會停在那里等待接收,故有以下兩種讀取數據的方式:

                  a)可以單獨啟一個線程來負責接收

                  b)通過timer來監控是否有新數據到

復制代碼
1 procedure   timer.ontimer.................
2 var temp:string;
3 begin
4 idtcpclient.readfromstack(false,1,false);
5 while idtcpclient.InputBuffer.Size> 0 do begin
6 temp:=idtcpclient.ReadLn;
7 end;
8 end;
復制代碼

             2)如果能知道要取的數據包的大小,可以用readbuffer(abuffer,包長度)來取得包。

 

  d)斷開連接

復制代碼
1 begin
2 try
3 socket.Disconnect;
4 Memo1.Lines.Add('socket連接已斷開!');
5 btn1.Caption:='建立連接';
6 except
7 ShowMessage('斷開連接時出錯!');
8 end;
9 end;
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM