2013年2月2日 星期六

ServerSocket 元件的幫助


ServerSocket 元件的幫助

ServerSocket 元件
一、屬性
TServerSocket.Socket
指定獲得描述監聽連接端點的TServerWinSocket對象.
使用socket獲得:
1、在socket服務器上的當前活動連接的信息。
2、被socket服務器緩衝使用的連接線程信息。
3、能訪問被Windows socket API需要而調用的監聽連接的Windows socket句柄。

TServerSocket.ServerType
type TServerType = (stNonBlocking, stThreadBlocking);
繼承於TCustomServerSocket,指定被socket服務器接收到的每一個連接要么是non-
blocking(非阻塞模式),要么自動分配一個獨立的執行
線程。
描述:
設定ServerType為線程阻塞模式,服務器接收每一個socket連接會自動的產生一個新的
線程。當設定為線程阻塞模式,當讀或寫的時候,連接線程的執行將會延緩至
通過連接的所有信息傳輸結束。當socket服務器需要讀寫的時候,每一個連接的線程會
觸發OnClientRead或OnClientWrite事件。
(實際使用時,設定ServerType為線程阻塞模式,OnClientRead沒有發現被觸發)
設定ServerType為非阻塞模式,異步的處理所有通過Scoket連接的讀寫。當ServerType
為非阻塞模式,所有的客戶端連接缺省的在一個執行線程中處理。
當客戶端連接的另一端通過連接發送或者接收數據時,服務器端的OnClientRead或
OnClientWrite事件觸發。
注:當ServerType設定為stThreadBlocking時, 有一點很重要,OnClient相應的事件都
應當是線程安全的。
TServerSocket.ThreadCacheSize
繼承於TCustomServerSocket,指定能被新的客戶端連接重新使用的線程最大數量。
描述:
當ServerType設定為stThreadBlocking時,每一個被Socket服務器接受的新的連接會被給
於一個獨立的執行線程。為了提高性能,服務器sockets並不是當連接關閉的時候釋放掉
這些線程,而是把這些線程存儲在緩衝區裡。新的連接能夠重新使用緩衝裡的這些線程
。而不需要socket服務器每次接受一個連接的時候便創建一個線程。
設定ThreadCacheSize來指定能被緩衝復用的線程數量。理想的線程緩衝區大小依賴於
socket服務器接收到的客戶端的請求數量和頻率。如果線程緩衝區設的太低,當客戶端
連接被接收時,服務器sockets將會花費大量的時間在創建和釋放線程上。如果線程緩衝
區大小設定過高,服務器sockets就會沒必要的鎖定沒有被復用的線程內存。
(默認大小為10)
TAbstractSocket.Active
指明和其他機器的socket連接通訊是否是打開的或者是可利用的。
描述:
試圖使用或者改變socket連接前,讀取Ative屬性來確定連接是打開的或者已就緒。
對客戶端而言,設定Active用於打開或關閉一個與其他機器的socket連接。
對服務器而言,設定Active用於打開或關閉一個對客戶端請求可以利用的監聽連接。
在設計期,設定Active為True時,當應用程序運行時,使socket打開。
在運行期,使用Open或Close方法來打開或關閉連接。
TAbstractSocket.Port
(略)
要監聽的端口,如果在Service屬性中指定了服務類型,此屬性將被忽略。
TAbstractSocket.Service
(略)
繼承於TComponent的其他屬性:
TComponent.ComObject
指定被組件執行的接口引用。
TComponent.ComponentCount
指出被組件擁有的組件數量。
TComponent.ComponentIndex
指出組件擁有的組件的在組件屬性排列中的位置。
TComponent.Components
列出被組件所擁有的所有組件。
TComponent.ComponentState
描述當前組件狀態,並指出當前狀態State;
type TComponentState = set of (csLoading, csReading, csWriting, csDestroying,
csDesigning, csAncestor, csUpdating, csFixups, csFreeNotification, csInline,
csDesignInstance);
property ComponentState: TComponentState;
TComponent.ComponentStyle
管理組件的行為。
type TComponentStyle = set of (csInheritable, csCheckPropAvil,csSubComponent,
csTransient);
property ComponentStyle: TComponentStyle;
是一個只讀屬性,各種組件類型的標記是組件定義的一部分,在組件構造器中指定。一
個例外是csSubComponent,它可以在調用SetSubComponent 方法時設定。
TComponent.DesignInfo
TComponent.Name
TComponent.Owner
TComponent.Tag
TComponent.VCLComObject
二、方法
TServerSocket.Create
創建一個TServerSocket的實例。
描述:
在運行期調用TServerSocket.Create創建和初始化一個TServerSocket組件,在設計期放
置一個TServerSocket組件,自動創建一個socket服務器。
調用繼承的構造器之後,Create方法做了以下動作:
1、為Socket服務器分配一個封裝了Windows socket連接的TServerWinSocket對象。
2、初始化了Socket服務器的事件和錯誤發包器。
3、初始化線程緩衝區大小為10。
TCustomServerSocket.Destroy
銷毀一個TCustomServerSocket實例。
描述:
不要在一個應用程序中調用destroy方法,相反,使用free,Free方法能夠檢測服務器
socket不為nil,然後自動調用destroy。
destroy方法釋放描述監聽連接服務終點的TServerWinSocket對象。
TAbstractSocket.Close
TAbstractSocket.Open
繼承於TComponent的方法
TComponent.BeforeDestruction
在第一個destructor銷毀器被調用之前執行的所有操作。
描述:
組件的第一個destructor銷毀器執行之前,BeforeDestruction會被立即自動執行,不
要在你的應用程序中明確調用。
TComponent.Destroying
指出組件和他擁有的組件將被銷毀。
描述:
Destroying方法在ComponentState屬性中將狀態設定為csDestroying 。
對每一個擁有的組件一次調用destroying方法,使它們的csDestroying標記被設定。如
果csDestroying已經設定了,Destroying將不起作用。
沒有必要直接調用Destroying方法,Destroying方法自動在destructor 銷毀器中自動執
行,以調用free方法開始,以對象本身destroying結束。
TComponent.ExecuteAction
將組件作為目標激發一個行為.
function ExecuteAction(Action: TBasicAction): Boolean; dynamic;

TComponent.FindComponent
指出組件是否擁有一個給定的組件
function FindComponent(const AName: string): TComponent; 。 。 。 。 。 。

(還有很多繼承於TComponent的方法)
三、事件
分別繼承於TCustomServerSocket和TCustomSocket
繼承於TCustomServerSocket的事件:
TCustomServerSocket.OnClientConnect
當客戶端完成一個被服務器socket接受的連接時觸發此事件。
property OnClientConnect: TSocketNotifyEvent;
描述:
當一個客戶端socket完成一個向服務器socket的連接後,寫一個OnClientConnect事件句
柄進行指定的動作。例如:socket可以在OnClientConnect事件中通過連接開始讀或寫。
以下是服務器Socket一路執行到OnClientConnect所發生的事件:
1、服務器Socket打開或監聽前,一個OnListen事件先發生。
2、服務器Socket在一個監聽隊列裡接收客戶端請求,服務器Socket接受這些請求中的一
個,並且為新的Socket連接接收一個windows socket句柄。
3、服務器socket產生一個OnGetSocket事件,在windows句柄​​中傳遞。如果為一個新的連
接TServerClientWinSocket對像沒有在OnGetSocke事件句柄中被創建,那麼服務器
socket將會創建一個。 TServerWinSocket對象繼續監聽其他客戶端。
4、使用一個新的TServerClientWinSocket對象,OnAccept三事件被觸發。
5、如果ServerType是stThreadBlocking,並且緩衝區中沒有可用的線程,OnGetThread
事件會發生,如果OnGetThread事件句柄沒有創建線程,服務器socket將會創建
TServerClientThread。
6、如果ServerType是stThreadBlocking,當線程開始執行時,OnThreadStart事件觸發

7、客戶端完成到TServerClientWinSocket對象的連接,OnClientConnect事件觸發

注意:
如果ServerType是stThreadBlocking,確保OnClientConnect事件裡的代碼是線程安全的
使用GetClientThread方法參數來訪問指定的線程信息。
注意:
當設定相關TServerWinSocket的OnClientConnect事件句柄,TServerSocket的
OnClientConnect事件句柄也被設定。
TCustomServerSocket.OnClientDisconnect
(略)
TCustomServerSocket.OnClientError
當建立、使用、或者終止一個針對單獨客戶Socket的連接發生錯誤時觸發。
描述:
寫一個OnClientError事件句柄響應針對一個獨立客戶端連接所引發的錯誤。在
OnClientError事件句柄中將ErrorCode參數設為0,能夠成功的​​​​處理錯誤狀態,防止錯誤
被觸發。
TCustomServerSocket.OnClientRead
TCustomServerSocket.OnClientWrite
TCustomServerSocket.OnGetSocket
當服務器Socket需要創建一個新的TServerClientWinSocket對象來描述一個到客戶端的
連接端點時觸發。
property OnGetSocket: TGetSocketEvent;
描述:
寫一個OnGetSocket事件句柄創建一個指定的TServerClientWinSocket類的繼承對象,供
服務器Socket使用。在參數ClientSocket中返回新的TServerClientWinSocket對象,
Sender參數是描述監聽連接服務端點的TServerWinSocket對象。
TCustomServerSocket.OnGetThread
當服務器socket為客戶端socket的連接需要創建一個新的執行線程時觸發。
property OnGetThread: TGetThreadEvent;
描述:
當客戶端連接過來的時候,OnGetThread事件句柄創建一個指定的TServerClientThread
子類,在參數SocketThread中,表示返回一個新的TServerClientThread對象。
大多數應用程序使用線程阻塞服務器組件,就是想要提供OnGetThread 事件句柄,並且
應用TServerClientThread在自己的線程安全方式下進行讀寫操作,而不是依賴缺省的在
OnClientRead事件或者OnClientWrite事件中的TServerClientThread,因為
OnClientRead事件和OnClientWrite事件句柄存在於服務器socket,而服務器socket在全
局內存中。 (我理解,也就是單線程的)
Sender參數也​​​​就是描述監聽連接端點的TServerWinSocket對象。 ClientSocket參數描述
將要與客戶端形成的服務連接端點。
TCustomServerSocket.OnThreadEnd
TCustomServerSocket.OnThreadStart
(略)
繼承於TCustomSocket的事件
TCustomSocket.OnAccept
接受客戶端的連接請求之後馬上觸發。
客戶端連接請求被接受之後,為服務器socket寫OnAccept事件句柄進行指定的操作。