簡單網路聊天室實現
---------------------------------------
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...