如何在 Qt 中从服务器向连接的客户端发送消息

Posted

技术标签:

【中文标题】如何在 Qt 中从服务器向连接的客户端发送消息【英文标题】:How to send messages to connected clients from server in Qt 【发布时间】:2018-01-13 14:57:05 【问题描述】:

我知道在发出QTcpServer newConnection 时如何向新连接的客户端发送消息。我的做法是这样的:

connect(serverConnection.tcpServer, &QTcpServer::newConnection, this, &ServerInterface::sendMessages);

void ServerInterface::sendMessages()

    QByteArray messagesToClients;
    QDataStream out(&messagesToClients, QIODevice::WriteOnly);
    QTcpSocket *clientConnection = serverConnection.tcpServer->nextPendingConnection();
    out << inputBox->toPlainText(); //get text from QTextEdit
    clientConnection->write(messagesToClients);

但我想要做的是,每当单击服务器中的发送消息按钮时,它都会向当前连接的客户端发送消息。我提供的代码只能向新连接的客户端发送一条新消息。我不知道如何实现我想做的事情,那么有人可以为我提供一种方法吗?我对 Qt 网络有点陌生。 谢谢。

【问题讨论】:

您可以通过另一个socket 广播来自QTcpServer 的返回信息,并在客户端捕获此信息。 您需要跟踪您的客户端..我只知道“socketDescriptor”..如果您想与您的客户端通信,请尝试通过其套接字描述符将消息发送到每个客户端套接字..一个可靠的可靠的 QTcpServer 示例在这里找到youtube.com/watch?v=iKtCXUHsV70&t=43s 【参考方案1】:

只需将您的连接存储在容器中。像这样: 在您的 ServerInterface h 文件中:

class ServerInterface 
// your stuff
public slots:
  void onClientConnected();
  void onClientDisconnected();
private:
  QVector<QTcpSocket *> mClients;
;

在您的 ServerInterface cpp 文件中:

  connect(serverConnection.tcpServer, SIGNAL(newConnection(), this, SLOT(onClientConnected());
void ServerInterface::onClientConnected() 
  auto newClient = serverConnection.tcpServer->nextPendingConnection();
  mClients->push_back( newClient );
  connect(newClient, SIGNAL(disconnected()), this, SLOT(onClientDisconnected());


void ServerInterface::onClientDisconnected() 
  if(auto client = dynamic_cast<QTcpSocket *>(sender()) 
   mClients->removeAll(client);
  
void ServerInterface::sendMessages() 
  out << inputBox->toPlainText();
  for(auto &client : mClients) 
    client->write(messagesToClients);
  

【讨论】:

以上是关于如何在 Qt 中从服务器向连接的客户端发送消息的主要内容,如果未能解决你的问题,请参考以下文章

Qt WebSockets,如何向客户端发送消息

在 python 中从服务器发送一些行到 QT(C++) 客户端

如何在不同进程中从远程服务向 IPC 客户端发送数据

如何在扭曲的python中从服务器发送列表中的内容?

在 Azure Service Fabric (API) 中从一个微服务向另一个微服务发送消息

如何从主(winsock)向服务器发送消息?