熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

使用TCP/IP協議實現聊天程序

2013-11-23 17:45:47  來源: Delphi編程 

  TCP/IP協議的傳輸即面向點到點的傳輸方式!

  創建應用程序

  選擇NEW菜單下的Application選項創建一個普通的應用程序

  創建所需控件

  首先在控件欄的Win頁中選擇ImageList控件和CoolBar控件再從Win欄選擇ToolBar控件放置到CoolBar 控件上用鼠標右鍵單擊ImageList控件在彈出的菜單中選擇ImageList Editer選項彈出ImageList Editer對話框單擊Add按鈕選擇幅位圖在對象管理器Object Inspector中將ToolBar控件的Image屬性設為ImageList用鼠標右鍵單擊ToolBar控件New Button選項總共創建個ToolButton在 對象管理器中將個ToolButton的ImageIndex屬性分別設置為此時ImageList控件中的幅位圖將會分別顯示在Toolbutton上個ToolButton控件的ShowHint屬性全都設置為ture並將它們的Hint屬性分別設置為監聽連接斷開連接更改你的昵稱退出聊天程序

  然後在窗體中放置一個Edit控件Memo控件StatusBar控件和一個Label控件將Label控件的Caption屬性設置為輸入框

  最後也是最關鍵的在控件欄的Internet頁中選擇SeverSocket控件和ClientSocket控件放置在窗體中將SeverSocket控件和ClientSocket控件的Port屬性設置為SeverSocket控件是基於TCP/IP協議傳輸的服務器方的控件它的主要作用是用來監聽其它基於TCP/IP傳輸計算機的連接請求並在收到連接請求時建立連接進行數據傳輸ClientSocket控件是基於TCP/IP傳輸的客戶方的控件它的主要作用是向監聽 TCP/IP傳輸的服務器發出連接請求在收到服務器的允許連接的響應後建立連接並傳輸數據之所以在窗體中同時創建ServerSocket和ClientSocket控件是因為應用程序既可作為服務器又可作為客戶端使用

  Serversocket和ClientSocket之間的連接

  首先設置兩個全局變量

NickName:string;

b_Client:boolean;

  其中NickName用於放聊天人的名稱b_Client用於表明應用程序是否作為客戶端進行數據傳輸

  在窗體Form的Oncreate事件中初始化變量代碼如下

procedure TFormFormCreate(Sender:TObject);

begin

NickName:+=我的昵稱;

b_Client:=ture;

end;

  雙擊ToolButton編寫服務器監聽代碼如下

procedure TFormToolbuttonClick(Sender:TObject);

begin

ClientSocketclose;

ServerSocketopen;

StatusBarSimpleText:=開始監聽

end;

  雙擊ToolButton編寫客戶的申請連接代碼如下

procedure TFormToolButtonClick(Sender:TObject);

var s:string;

begin

if ClientsocketActive then

ClientSocketclose;

if InputQuery(連接到計算機要連接的計算機名稱或IP地址s) then

if Length(s)> then 

with ClientSocket do

begin

Host:=s;

open;

end;

end;

  在對象管理器中雙擊ClientSocket事件頁的OnConnecting事件編寫處理客戶等待連接請求代碼如下

procedure TFormClientSocketConnecting(Sender:TObject;Socket:TCustomWinSocket);

begin

StatusBarSimpleText:=等待來自+SocketRemoteAddress+的連接允許響應;

end;

  在對象管理器中雙擊SeverSocket事件頁的OnAccept事件處理服務器響應連接事件代碼如下

procedure TFormSeverSocketAccept(Sender:TObject;Socket:TCustomWinSocket);

begin

b_Client:=false;

StatusBarSimpleText:=連接到+SocketRemoteAddress;

end;

  在對象管理器中雙擊ClientSocket事件頁的OnConnect事件OnConnect事件在連接成功時被調用代碼如下

procedure TFormClientSocketConnect(Sender:TObject;Socket:TCustomWinSocket);

begin

b_Client:=ture;

StatusBarSimpleText:=連接成功;

end;

  ServerSocket和ClientSocket之間的數據傳輸

  聊天的內容是通過Edit控件輸入並在敲回車鍵後顯示在Memo控件中再傳輸到與之連接的計算機中Edit的OnKeyDown事件代碼如下

procedure TFormEditKeyDown(Sender:TObject;var Key:Word;Shift:TShiftState);

begin

if Key=VK_Return then

begin 

MemoLinesAdd(NickName+:+EditText;

if b_Client then

ClientSocketSocketSendText(MemoLines[MemolinesCount])

else

ServerSocketSocketConnections[]SendText(MemoLines[MemolinesCount]);

end;

end;

  在ServerSocket控件的onread事件中編寫服務器接收到數據後的動作代碼如下

procedure TFormServerSocketClientRead(Sender:TObject;Socket:TCustomWinSocket);

begin

MemolinesAdd(SocketReceiveText);

end;

  在ClientSocket控件的onread事件中編寫客戶端接收到數據後的動作代碼如下

procedure TFormClientSocketRead(Sender:TObject;Socket:TCustomWinSocket);

begin

MemolinesAdd(SocketReceiveText);

end;

  斷開Serversocket和ClientSocket之間的連接

  雙擊ToolButton編寫客戶端斷開的處理過程代碼如下

procedure TFormToolButtonClick(Sender:TObject);

begin

ClientSocketclose;

StatusBarSimpleText:=斷開連接;

end;

  編寫服務器響應客戶端斷開的處理過程代碼如下

procedure TFormServerSocketClientDisconnect(Sender:TObject;Socket:TCustomWinSocket);

begin

SeverSocketclose;

StatusBarSimpleText:=斷開連接;

end;

  更改聊天者的昵稱

  雙擊Toolbutton編寫更改昵稱代碼如下

procedure TFormToolButtonClick(sender:TObject);

var

s:string;

begin

if InputQuery(更改昵稱你的新昵稱s) then

if Length(s)> then

NickName:=s;

end;

  退出應用程序

  雙擊Toolbutton編寫退出應用程序代碼如下

procedure TFormToolButtonClick(sender:TObject);

ClientSocketclose;

ServerSocketclose;

Formclose;

end;

  保存並運行應用程序

  最好在網上運行該程序如果沒聯網但你的計算機支持TCP/IP協議(可以通過網絡鄰居安裝TCP/IP協議)你可以在你的計算機上從我的電腦中運行該應用程序的兩個實例運行後將一個聊天程序作為服務器監聽另一個聊天程序作為客戶與服務器連接並聊天局域網中同樣可以運行!!!


From:http://tw.wingwit.com/Article/program/Delphi/201311/25042.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.