c++builder中的Tserversocket,Tclientsocket最簡單的兩種開發.

    如果用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情況下使用非阻塞模式來編寫網絡程序....

發佈了24 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章