[BCB] ServerSocket (stThreadBlocking 模式)

最近的一點點心得,記錄在這
ServerSocket (stThreadBlocking 模式)
在 Server Thread 的 Execute() 中,
當 Server ServerSocket 的 Active 設為 true 開啟的時候,會發生
Event: ServerSocketListen 這跟 NonBlocking 模式的時候一樣。
最大的不同點在於,當有Client連上的時候會連續發生幾個事件:
依序是
ServerSocketGetSocket
ServerSocketAccept
ServerSocketGetThread
ServerSocketThreadStart
我們要做事情的地方在ServerSocketGetThread
先看一下 ServerSocketGetThread 基本的定義
void __fastcall Server_Thread::ServerSocketGetThread(TObject *Sender, TServerClientWinSocket *ClientSocket, TServerClientThread *&SocketThread)
這個Event他接了二個主要的東西給我們
1. ClientSocket
2. SocketThread
SocketThread我們可看看成 Server Thread 的 Child Thread。
這個SocketThread 最大的問題在於,他的一些功能在TServerClientThread
中是被定義為virtual 比方
virtual void __fastcall DoTerminate(void);
virtual void __fastcall Execute(void);
virtual void __fastcall ClientExecute(void);
virtual void __fastcall Event(TSocketEvent SocketEvent);
virtual void __fastcall Error(TErrorEvent ErrorEvent, int &ErrorCode);
virtual void __fastcall HandleException(void);
然後 TServerClientWinSocket 特性是會自己去 run ClientExecute 裡面的 code
所以我們要自己在定義一個繼承 TServerClientThread 的 class 來重載過 SocketThread ,
然後自己實做 ClientExecute 跟其它想要的 virtual function。
但是有一個很重要的問題就是,現在 SocketThread 是重載的狀態,所以定義自己的 event,
或是任何 public 的 function,外面都看不到,都只能自己用。
所以如果不把得到的封包(資料)在 Child Thread 自己處理好,
而是想把封包的資訊傳出來的話,就只能用 Synchronize 的方式傳回主程式。 (要相互include =_= )
如果是想要做到 Child thread 之間相互溝通的話,
(ex: 把Child thread (1) 的封包傳給其他的Child thread (2))
目前做法是用Synchronize的方式傳回主程式,
然後在由主程式去 Call Server Thread 的 Public Function 傳給 Child thread 。
所以目前我覺得 ServerSocket 在 stThreadBlocking的模式下,
最難的地方在在於 Child thread 相互溝通,雖然也是有方式,但是不是很直覺。
不是很方便使用,而且還有非常多好用的 event 消失了。

留言