我使用的是Embarcadero C ++ Builder,我知道如何打开连接并等待服务器端的回答(客户端可以打开连接,发送消息并读取从服务器发送的消息,直到连接关闭)。
客户方:
IdTCPClient1->Connect();
IdTCPClient1->Socket->WriteLn("message from client");
ShowMessage(IdTCPClient1->Socket->ReadLn());
IdTCPClient1->Disconnect();
服务器端:
ShowMessage(AContext->Connection->Socket->ReadLn());
AContext->Connection->Socket->WriteLn("Message from server");
AContext->Connection->Disconnect();
现在,如果客户端在客户端打开连接,则可以交换消息,但是我需要服务器向所有用户发送消息,这意味着客户端将不知道何时打开连接。我想我正在寻找一些等待服务器消息的事件。我发现的所有例子都是Delphi而不是C ++。此外,当第一次连接每个客户端时,我创建了一个vector<TIdContext*>
来保存所有连接,这很正常。
答案 0 :(得分:0)
以下是如何从TIdTCPServer向所有连接的客户端发送消息的示例:
TIdContext *MyContext;
TList *ClientsList = IdTCPServer1->Contexts->LockList();
try {
for (int i = 0; i < ClientsList->Count; i++) {
MyContext = (TIdContext*) ClientsList->Items[i];
MyContext->Connection->IOHandler->WriteLn("Message for all the clients");
}
__finally {
IdTCPServer1->Contexts->UnlockList();
}
答案 1 :(得分:0)
你说
...这意味着客户端不知道何时打开连接。我想我正在寻找一些等待服务器消息的事件。
上面的答案中有很好的选择,如果你想继续使用单个TCP连接,让它保持打开状态,并监控消息。
评论中提到的另一个选项是(也)设置UDP连接。在每个&#34;客户端&#34;上,创建一个侦听特定端口的iDUDPServer(将是与TCP连接不同的端口)。在您的&#34;服务器&#34;上,创建一个TIdUDPClient。 请注意这里术语的不同,您将在您称之为TCP客户端的地方安装UDPServer,反之亦然。
使用此服务从服务器向您的客户端发送UDP消息。您将在(客户端)IdUDPServer OnUDPRead事件中捕获该消息。
如果您的所有客户端都位于同一网段,则可以使用UDP广播向所有正在侦听的客户端发送单个消息。如果没有,请使用其IP地址向每个客户发送消息。
您的一个问题是缺少C ++示例。对不起,我无法帮助解决C ++代码问题。这是伪代码/过程,您必须管理语言语法:
在您的&#34;客户&#34;,
上创建一个TIdUDPServer(将其放在表单上,它必须可以监听)。
将DefaultPort设置为侦听端口(如果您愿意,可以设置其他选项)
在您的&#34;服务器&#34;
上创建TIdUPDClient。
通过以下方式将您的消息发送到特定IP:
a:设置IdUDPClient.Host(目标)
b:设置IdUDPClient.Port(目标)
c:IdUDPClient.Send(msg)
或者,您可以使用以下网址向您网段上的所有人广播:
a:IdUDPClient.Broadcast(msg,TargetPort)
&#34; msg&#34;将作为AData参数在IdUDPServerUDPRead事件中显示在您的客户端上。
此选项可能稍微复杂一些,因为涉及两个消息路径,但它不要求客户端打开与服务器的TCP连接,也不需要为入站消息设置监视器循环。事实上,如果客户不知道要连接,它可以用来宣传服务器的位置。此UDP通信另外到您现有的TCP连接,因此这些连接保持不变。