目前我使用 TIdTCPServer 和 TIdTCPClient Indy组件完全成功制作服务器和客户端,但是当两个客户端同时连接到服务器时我遇到了麻烦。我有两个网络192.168.10.23
和localhost
,当客户端使用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();
}
}
此代码是否支持多个客户端?
答案 0 :(得分: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);
}