0

目前我已经成功地使用TIdTCPServerTIdTCPClient Indy 组件完全制作服务器和客户端,但是当两个客户端同时连接到服务器时我遇到了麻烦。我有两个网络192.168.10.23localhost当客户端使用 localhost 连接时很好,第二个客户端尝试连接到192.168.10.23那里仍然等待第一个客户端断开连接。

谁能给我建议如何使用 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();
    }
}

此代码是否支持多个客户端?

4

1 回答 1

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);
}
于 2012-07-03T22:23:30.477 回答