使用 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