使用 Echo 客户端示例从 Qt UI 连接到 WebSocket 服务器

Posted

技术标签:

【中文标题】使用 Echo 客户端示例从 Qt UI 连接到 WebSocket 服务器【英文标题】:Connect to WebSocket server from Qt UI with Echo Client Example 【发布时间】:2015-04-08 07:24:52 【问题描述】:

我在 CLI 中使用Websocket Echo Server Example,它工作正常。我正在尝试从我的 Qt GUI 项目连接到此服务器。我有一个带有适当插槽的 MainWindow 类

void MainWindow::on_pushButton_clicked()

    qDebug() << "Push btn clicked";
    EchoClient client(QUrl(QStringLiteral("ws://localhost:1234")));

和来自 CLI Websocket Echo Client Example 的 EchoClient 文件。

主要问题是当我按下表单上的按钮时无法连接到服务器。但是,我看到调试消息 “Push btn clicked”。它应该打印“Hello, world!”。但没有任何反应,没有错误。即使信号void EchoClient::onConnected() 也不会被触发。

但如果我将 EchoClient client(QUrl(QStringLiteral("ws://localhost:1234"))); 移动到 main.cpp 它会连接:

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    EchoClient client(QUrl(QStringLiteral("ws://localhost:1234")));
    return a.exec();

我是 C++ 和 Qt 的新手。 为什么会发生这种情况?它与 UI 中的处理线程有关吗?我应该知道什么?

Qt 5.4.

【问题讨论】:

【参考方案1】:

在您的 on_pushButton_clicked() 函数中,您正在函数堆栈中创建 EchoClient(它是异步的)。一旦函数退出,EchoClient 对象就会从堆栈中销毁。

您可以考虑不同的解决方案,例如在 MainWindow 类中创建私有字段

private EchoClient *client;

然后在 MainWindow 构造函数中将其设置为 null:

this->client = NULL;

只有此时在你的 click() 例程中做这样的事情:

void MainWindow::on_pushButton_clicked()

    qDebug() << "Push btn clicked";
    if (this->client == NULL)
    
        this->client = new EchoClient(QUrl(QStringLiteral("ws://localhost:1234")));
    
    else
        qWarning() << "Carefull, the client is already running";

然后由您来处理您创建的client 对象的类似循环。

您可能必须考虑何时要销毁它,可能是通过“重置”按钮例程。

我建议阅读:http://doc.qt.io/qt-4.8/qapplication.html#details

【讨论】:

以上是关于使用 Echo 客户端示例从 Qt UI 连接到 WebSocket 服务器的主要内容,如果未能解决你的问题,请参考以下文章

将 Qt EchoClient 连接到 https://www.websocket.org/echo.html 时赢得 QAbstractSocket::UnsupportedSocketOperat

Windows下Qt 应该怎么连接Redis

通过 QT C++ 连接到 SQL server 2005

Qt 客户端 - 连接到 C 服务器

如何从 C++ 端连接到 QML 项目的 onClick 事件

Qt 连接到 WebSockets 服务器