2012-07-03 48 views
0

處理多個客戶端目前我使用的成功TIdTCPServerTIdTCPClient Indy組件服務器和客戶端完全做,但我得到了麻煩時,兩個客戶端連接到服務器在同一時間。我有兩個網絡192.168.10.23localhost,當客戶端使用本地主機連接時很好,第二個客戶端嘗試連接到192.168.10.23仍然在等待第一個客戶端斷開連接。如何利用Indy 10

任何人都可以請給我建議如何處理使用Indy10的多個客戶端。

補充:

這是我的代碼:

void __fastcall TfrmServer::TCPServerConnect(TIdContext *AContext) 
{ 
    TList *list = TCPServer->Contexts->LockList(); 
    try 
    { 
     for (int j=0; j < list->Count; j++) 
     { 
      TIdContext *myContext = static_cast<TIdContext*>(list->Items[j]); 
      CLIENT_AUTH(myContext); 

      INFO_CLIENT *br = ((INFO_CLIENT*)brb); 
      br->ClientIP = myContext->Binding()->IP; 
      br->ClientPort = myContext->Binding()->Port; 
      br->peerIp  = myContext->Binding()->PeerIP; 
      br->peerPort = myContext->Binding()->PeerPort; 

      if (myContext->Connection->Connected()) 
      { 
       for (int i=0; i < list->Count; i++) 
       { 
        ListIt = ListClient->Items->Add(); 
        ListIt->Caption = String(i+1); // number 
        ListIt->SubItems->Add(br->UserName); // Name 
        ListIt->SubItems->Add(br->ClientIP); // Ip 
        ListIt->SubItems->Add(br->peerIp); // Peer Ip 
        ListIt->SubItems->Add(br->ClientPort); // port 
        ListIt->SubItems->Add(br->peerPort); // port 
        ListIt->SubItems->Add("Connected"); // Status 
       } 
      } 
     } 
    } 
    __finally 
    { 
     TCPServer->Contexts->UnlockList(); 
    } 
} 

這篇代碼有多個客戶端的支持?

+0

你所示的代碼是完全錯誤的。你需要擺脫它。當「TIdTCPServer :: Contexts」列表被鎖定時(您根本不應該這樣做),但沒有其他客戶端可以連接到服務器。而且你正在從主線程的上下文之外操縱UI,這會導致崩潰和死鎖。您需要重新編寫此代碼。 –

回答

3

TIdTCPServer支持多個網絡上的多個同時連接,並且工作得很好。如果您的客戶正在彼此序列化,那麼問題必須在您自己的代碼或網絡設置中。 Indy不會阻止多個客戶端同時連接到同一臺服務器。

更新:試試這個:

class TAddToListSync : public TIdSync 
{ 
protected: 
    TIdContext *FContext; 

    void __fastcall DoSynchronize() 
    { 
     TListItem *ListIt = frmServer->ListClient->Items->Add(); 
     ListIt->Caption = String(ListIt->Index+1); // number 
     ListIt->SubItems->Add(...); // Name 
     ListIt->SubItems->Add(FContext->Binding()->IP); // Ip 
     ListIt->SubItems->Add(FContext->Binding()->PeerIP); // Peer Ip 
     ListIt->SubItems->Add(FContext->Binding()->Port); // port 
     ListIt->SubItems->Add(FContext->Binding()->PeerPort); // port 
     ListIt->SubItems->Add("Connected"); // Status 
    } 

public: 
    __fastcall TAddToListSync(TIdContext *AContext) 
     : TIdSync(), FContext(AContext) 
    { 
    } 

    static void Add(TIdContext *AContext) 
    { 
     TAddToListSync *sync = new TAddToListSync(AContext); 
     sync->Synchronize(); 
     delete sync; 
    } 
}; 

void __fastcall TfrmServer::TCPServerConnect(TIdContext *AContext) { 
{ 
    CLIENT_AUTH(AContext); 
    TAddToListSync::Add(AContext); 
} 
+0

嗨Mr.Remy 我已在上面添加了我的代碼。我認爲我的網絡很好,我假設代碼爲'TIdContext * myContext = static_cast (list-> Items [j]);'將客戶端添加到列表中,然後嘗試使用客戶端'192.168連接到服務器。 10.12'這個工作,當第二個客戶端嘗試使用'localhost'連接仍然不起作用? – Adhy

+0

您的代碼正在使服務器死鎖。我已經更新了我的答案,並提供了另一種解決方案供您嘗試。 –