2012-07-03 46 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

您的代码正在使服务器死锁。我已经更新了我的答案,并提供了另一种解决方案供您尝试。 –