delphi中socket的操作方式
delphi分別使用tclientsocket元件和tserversocket元件來操縱使用者端 socket和伺服器段socket的連線和通訊。根據連線發起的方式以及本地 socket要連線的目標,socket之間的連線可以分為:使用者端連線、監聽連線以及伺服器端連線。
(1)所謂使用者端連線,是指由使用者端的 socket提出連線請求,要連線的目標是伺服器端的socket。為此,使用者端的socket首先要描述它要連線的伺服器端socket,主要是伺服器端socket的位址和埠號,然後再定位所要連線的伺服器端socket。找到以後,就向伺服器端socket請求連線。此時,伺服器端的socket未必正好處於準備好狀態。不過,伺服器端socket會自動維護乙個客戶請求佇列,通過這個佇列的優先順序,會在適當的時候通過請求回應的方式向使用者端socket發出「允許連線」(accept)的訊號,這樣便在使用者端和伺服器端通過sockets建立了連線!
(2)所謂監聽連線,是指伺服器端socket並不定位具體的使用者端socket,而是處於等待連線狀態,當伺服器端 socket監聽到或者接收到使用者端socket的連線請求的時候,它就回應使用者端socket的請求建立乙個新的socket控制碼並與使用者端連線,而伺服器端socket繼續處於監聽狀態,這樣可以與多個使用者端同時建立連線。
(3)所謂伺服器端連線,是指當伺服器端socket接收到使用者端socket的連線請求後,就把伺服器端socket的描述傳送給使用者端。一旦使用者端確認了此描述,就建立了連線!
3 執行緒控制的提出
一旦伺服器與使用者端建立了連線之後,就可以通過 internet 傳輸資料和檔。但是在winsock中存在兩種傳輸模式「阻塞」和「非阻塞」的概念。
一般都採用非阻塞方式。在使用者端,如果把 clienttype特性設定為ctnonblocking,表示採用非阻塞方式進行連線。當伺服器端 socket試圖進行讀/寫操作的時候,使用者端 socket就會得到通知,即onread或者onwrite事件。
對於伺服器端socket來說,如果把servertype特性設定為 stnonblocking,表示採取非阻塞方式進行連線。當使用者端 socket試圖進行讀/寫的時候,伺服器端socket就會得到通知,即onclientread或者onclientwrite事件。
與非阻塞方式不同的是,在阻塞方式下沒有諸如onread或者onwrite等非同步事件。socket必須主動去讀或者寫資料。在讀寫操作完成之前,其他程式碼都無法執行,成為了純粹的獨佔使用方式,整個應用程式將處於等待狀態,大大降低應用程式的效能。
對於使用者端socket來說,如果把 clienttype特性設定為ctblocking,表示採取阻塞方式進行連線,為了盡可能的減少阻塞方式的負面影響,可以把所有涉及到讀寫的操作放在乙個單獨的執行緒中,這樣可以使其他的執行緒可以繼續得到執行。
對於伺服器端 socket來說,如果把servertype設定為stthreadblocking,表示採取阻塞方式進行連線。delphi 中將為每乙個阻塞方式的連線自動分配乙個新的執行緒,這樣即使乙個客戶正在進行讀寫操作,其他的客戶也不必等待。
4 在使用者端使用多執行緒技術
在阻塞模式下,為了盡可能的減少阻塞方式的***,可以把所有的涉及到讀寫操作放在乙個單獨的執行緒種。為此,需要建立乙個新的執行緒物件,然後過載它的execute方法,線上程程式碼中,我們通過twinsockstream物件來進行讀寫操作。
procedure tclientthread.execute;
var sstream: twinsockstream;
sbuffer: string;
begin
//建乙個twinsocketstream物件例項,設定連線超時
ssteam: = twinsockstream.create (clientsocket.socket, 60000);
try //獲取和操作命令,直到連線斷開或者執行緒終止
while (not terminate) and (clientsocket.active) do
begin
trygetnextrequest (sbuffer);
//將請求寫回到server
sstream.write (sbuffer, length (sbuffer) + 1);
…except
if not(except object is eabort) then
//處理一些自定義的異常情況
synchronize(handlethreadexception);
end;
end;
finally
sstream.free;
end;
end;
5 在伺服器端使用多執行緒技術
在伺服器端,delphi將自動為每乙個阻塞方式的連線分配乙個新的執行緒,並通過tserverclientthread來操縱每乙個執行緒。所以不能通過物件庫中的嚮導來建立執行緒物件,只能手工建立乙個tserverclientthread的派生類,然後過載clientexcute方法。procedure tserverthread.clientexcute;
var sstream:twinsocketstream;
sbuffer:array[0..9] of char
begin
//獲取和操作命令,直到連線斷開或者執行緒終止
while (not terminate) and (clientsocket.active) do
begin
trysstream:= twinsocketstream.create(clientsocket.socket,60000);
try //填充sbuffer陣列
fillchar(sbuffer,10,0);
//延遲時間60秒
if sstream.waitfordata(60000) then
begin
if sstream.read(sbuffer,10)=0 then
clientsocket.close;
……end
else clientsocket.close;
except
handleexception;
end;
finally
sstream.free;
end;
end;
end;
總結:通過使用者端和伺服器端的多執行緒式控制制,當我們需要對大資訊量的資料處理的時候,尤為方便,而且能夠很大程度上提高網路資源的利用率。目前我們正在研究通過執行緒控制來對資料庫的查詢進行優化處理以及資料傳送問題!
WinSock程式設計的多執行緒式控制
delphi中socket的操作方式 delphi分別使用tclientsocket元件和tserversocket元件來操縱使用者端 socket和伺服器段socket的連線和通訊。根據連線發起的方式以及本地 socket要連線的目標,socket之間的連線可以分為 使用者端連線 監聽連線以及伺服...
多執行緒程式設計
1 多執行緒的基本思路不是在介面執行緒執行費時的 而是專門啟動乙個執行緒 稱作工作執行緒 來完成,介面執行緒只負責介面的 顯示 和操作,而工作執行緒只負責耗時的操作過程。2 對於普通的win32應用程式來說,執行緒可以分為兩種 介面 ui user inte ce 執行緒和工作執行緒。介面執行緒一般...
多執行緒程式設計
如何編寫執行緒安全的dll 在我的工作中經常會編寫dll,這些dll有個共同的特點就是都有乙個初始化函式,乙個資源釋放函式,其他幾個函式都是核心功能函式。而且這些dll有時會被多個程序同時呼叫,這就牽扯到多程序的多執行緒呼叫dll的問題。有點繞口,以下我根據我實踐中遇到的問題,分四種情況分享一下我解...