如果用Tserversocket,Tclientsocket控件來開發網絡程序的時候,往往會想到是選擇異步好,還是同步好,也就是非阻塞和阻塞的選擇,而我們大部分有時候往往都沒怎麼考慮清楚,特別是對剛接觸過的人來說.
首先要弄清出,異步和同步的差別,異步通訊是所有的客戶請求都在一個線程中來處理,多個客戶同時同步連接的話,則採取排隊的方式(這就是C++ Builder中ServerSocket的非阻塞模式)。而對於同步程通訊,每當有一個客戶連接時,服務器就會開闢一個線程與之通訊(這就是C++ Builder中ServerSocket的阻塞模式--多線程).同步通訊產生的機制在於,當執行一個函數,比如說在客戶端執行一個connect,如果網絡很忙的話,客戶端可能會等很長的時間.而有一點要注意的是bcb的vcl的子線程根本就不處理消息的。所以如果你異步在線程裏使用Tserversocket或者Tclientsocket,非阻塞模式不能選擇,需要使用阻塞方式。
當如果你的服務端人數不多的話,處理的數據比較小的話,可以用非阻塞方式.而當你採用服務端和客戶端是需要文件傳輸的話,那麼服務端一般採用多線程的阻塞模式.
非阻塞模式下的寫法一般是直接在
void __fastcall ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall ServerSocket1ClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent,
int &ErrorCode);
void __fastcall ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket);
這些裏面直接寫代碼就可以了,比較簡單.
在用阻塞方式時候,你可以建立一個線程來處理你的每個socket連接.
class SrvThread : public Thread
{
private:
TClientSocket* ClientSocket;
protected:
void __fastcall Execute();
public:
__fastcall SrvThread(TServerClientWinSocket*);
};
每當有一個客戶連接時,在OnGetThread事件中開闢一線程:
void __fastcall TForm::ServerSocket1GetThread(TObject *Sender,
TServerClientWinSocket *ClientSocket,
TServerClientThread *&SocketThread)
{
SocketThread=new SrvThread(ClientSocket);
}
在SrvThread線程類中來處理數據:
void __fastcall SrvThread::Execute()
{
//Add your codes here ....................
}
關於阻塞方式還是非阻塞方式有很多種情況,例如還有非阻塞的select模型,還有重疊io.完成端口模型.同步的可以選擇配線程詞的阻塞模式.micro一般推薦在windows情況下使用非阻塞模式來編寫網絡程序....