簡單網路聊天室實現

2021-04-13 08:36:25 字數 4556 閱讀 1256

簡單網路聊天室實現

---------------------------------------

by clin003 from http://clin003.com/或http://blog.csdn.net/clin003/

---------------------------------------

學習目的:

初步認識網路程式設計概念

認識執行緒的型別的宣告及實現

設計乙個簡單的s/c模式結合的聊天程式

進一步認識元件的使用

**實現部分

定義乙個執行緒型別tclientdatathread,用來實現向infomemo元件非同步寫入交談雙方的內容。

type

tclientdatathread=class(tthread)

private

public

listbuffer:tstringlist;    //快取區,快取遠端傳送的當前聊天資訊

targetlist:tstrings;    //聊天的資訊存放

procedure    synchadddatatocontrol;    //同步執行過程

constructor execute;override;        //過載執行緒類的執行函式

procedure    terminate;        //用於結束執行緒,釋放資源

end執行緒型別中的方法具體實現部分:

constructor tclientdatathread.create(createsuspended:boolean);

begin

inherited create(createsuspended);

freeonterminate:=true;  //執行緒結束時自動釋放資源

listbuffer:=tstringlist.create; //建立字串列表變數,作為快取區

end;

procedure tclientdatathread.terminate;

begin

listbuffer.free;      //釋放字串列表所佔資源,即釋放快取區

inherited;

end;

procedure tclientdatathread.execute;

begin

synchronize(synchadddatatocontrol);   //同步處理字串的操作

end;

procedure tclientdatathread.synchadddatatocontrol;

begin

targetlist.addstrings(listbuffer);  //想targetlist中新增快取區新的字串

end;

procedure tform1.formcreate(sender: tobject);

varhostname,hostip:string;

begin

hostname:=tcpserver1.lookuphostname('127.0.0.1');//獲得主機名稱

hostip:=tcpserver1.lookuphostaddr(hostname);    //獲得主機ip位址

statusbar1.panels[0].text:='我的ip:'+hostip;  //在狀態列第一項顯示ip

end;

設定伺服器的引數,按鈕的onclick事件**:

procedure tform1.button2click(sender: tobject);

begin

tcpserver1.localport:=edit2.text;    //設定伺服器端口

tcpserver1.active:=ture;             //啟用伺服器

sendmemo.setfocus;                  //將焦點定位於資訊輸入區域

end;

為傳送按鈕新增**,用以傳送交談內容:

procedure tform1.button1click(sender: tobject);

vari:integer;

begin

tcpclient1.remotehost:=edit1.text;  //設定對方主機名

tcpclient1.remoteport:=edit2.text;  //對方主機埠號

tryif  tcpclient1.connect then        //如果已經建立連線

for i:=0 to sendmemo.lines.count-1 do

tcpclient1.sendln(sendmemo.lines[i]);//傳送資訊輸入區域的文字

finally

tcpclient1.disconnect;            //資訊傳送完畢,暫時斷開socket連線、

end;

sendmemo.setfocus;         //將焦點定位於資訊輸入區域

end;

tcpserver接到socket連線請求時自動觸發onaccept事件。下邊是onaccept事件**,將接收到的資訊增加到infomemo元件中,並將連線情況顯示在狀態列的第二項。

procedure tform1.tcpserver1accept(sender: tobject;

clientsocket: tcustomipclient);

vars:string;

datathread:tclientdatathread;

begin

//本地伺服器探測到新的訊息,開始建立乙個新的執行緒

datathread:=tclientdatathread.create(true);

//在資訊顯示框中顯示對方的訊息

datathread.targetlist:=infomemo.lines;

//在狀態列第二項中顯示對方的主機名和ip位址

statusbar1.panels[1].text:='連線到' + clientsocket.lookuphostname(clientsocket.remotehost)+'('

+clientsocket.remotehost+')';

//接受對方訊息,並儲存到緩衝區listbuffer中

datathread.listbuffer.add('==begin==');

s:=clientsocket.receiveln;

while s<>''  do  //獲得對方發來的訊息

begin

datathread.listbuffer.add(s);

s:=clientsocket.receiveln;

end;

datathread.listbuffer.add('===end===');

//繼續執行執行緒,把listbuffer中的訊息寫入targetlist,即infomemo元件

datathread.resume;

end;

為啦顯示socket連線的狀態,需要在tcpclient元件的onsend事件中,向狀態列輸出提示資訊:

procedure tform1.tcpclient1send(sender: tobject; buf: pansichar;

var datalen: integer);

begin

statusbar1.panels[2].text:='傳送資訊'+inttostr(datalen)+'個字元';

end;

關於執行緒的概念:

win32作業系統提供了在應用程式中執行多執行緒的能力。從16位的windows公升級到win32的乙個最

大受益便是:它允許多執行緒同時執行。

執行緒是一種作業系統物件,它表示在程序中**的一

條執行路徑。在每乙個win32的應用程式中都至少有乙個執行緒,它通常被稱為主線程或缺省執行緒。在

應用程式中也可以自由地建立別的執行緒去執行其他任務。

執行緒技術使不同的**可以同時執行。當然,只有在多c p u的計算機上,多個執行緒才能夠真正地

同時執行。然而,由於作業系統把c p u的時間分成很短的片段分配給每個執行緒,這樣給人的感覺好像

是多個線**的同時執行。

win32是一種搶占式作業系統,在搶占式多工環境中,作業系統負責管理哪個執行緒在什麼時候執行。如果當

執行緒1暫停執行時,執行緒2才有機會獲得c p u時間,我們說執行緒1是搶占的。如果某個執行緒的**陷入

死迴圈,這並不可怕,作業系統仍會安排時間給其他執行緒。

對比協作式作業系統,在windows 3.1下,程式設計師必須保證應用程式能夠把控制權返還給windows。如果這一步失敗,將

導致整個操作環境鎖死,或許你已經有過這樣的痛苦經歷。只要稍微想想便會明白, 16位的windows

是如此脆弱,它依賴於應用程式的運**況,並且不允許程式陷入死迴圈或無窮遞迴以及任何封閉狀

態。這是因為所有的應用程式都必須協助windows工作,這種工作型別被稱為協作式多工系統。

在delphi程式中使用多執行緒

對乙個windows程式設計師來說,執行緒提供了非常大的好處。可以在應用程式中的任何地方建立多個

附屬執行緒,它們在後台進行各種型別的處理。

JAVA網路程式設計實現簡單聊天室

public class client catch ioexception e start 輸出接收的訊息 newthread catch ioexception e start 客戶端需要兩個執行緒同時工作,乙個執行緒從控制台讀取資料,乙個執行緒將從伺服器返回的資料顯示在控制台上。伺服器 publ...

簡單聊天室

include include include include include include include include include include pthread t thread 2 void send msg void ip msg if connect sockfd,struct ...

WebSocket實現簡單聊天室

看了之前的文章,想必大家對websocket的原理已經有了乙個深入的理解,這一篇文章我們來看一下具體該如何去使用它。這裡,我用nodejs websocket實現乙個簡單的多人聊天室,從這個小案例中來學會使用websocket。nodejs websocket用法參見官方api 伺服器端 安裝引入n...