Qt5 WebSockets 测试应用未连接到测试服务

Qt5 WebSockets test app not connecting to test service

我想在 ws://echo.websocket.org 中打开一个 qt websocket 到测试服务,但我得到了错误 QAbstractSocket::RemoteHostClosedError 我将信号 error(QAbstractSocket::SocketError socketError) 连接到我代码中的一个插槽,以便读取错误编号然后查找它 in here

我的代码是这样的

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Controller w;
    w.initializeWebSocket("ws://echo.websocket.org", true);
    w.show();

    return a.exec();
}






Controller::Controller(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
}

void Controller::initializeWebSocket(QString url, bool debug)
{
    m_webSocketURL = url;
    m_webSocketDebug = debug;
    if(m_webSocketDebug)
        std::cout << "WebSocket server: " << m_webSocketURL.toStdString() << std::endl;
    QObject::connect(&m_webSocket, SIGNAL(connected()), this, SLOT(onConnected()));
    QObject::connect(&m_webSocket, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
    QObject::connect(&m_webSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)));
    QObject::connect(&m_webSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(onTextMessageReceived(QString)));
    m_webSocket.open(QUrl(m_webSocketURL));
}

void Controller::onConnected()
{
    if (m_webSocketDebug)
        std::cout << "WebSocket connected" << std::endl;
    m_webSocket.sendTextMessage(QStringLiteral("Rock it with HTML5 WebSocket"));
}

void Controller::onDisconnected()
{
    if (m_webSocketDebug)
        std::cout << "WebSocket disconnected" << std::endl;
}

void Controller::onError(QAbstractSocket::SocketError error)
{
    std::cout << error << std::endl;
}

void Controller::onTextMessageReceived(QString message)
{
    if (m_webSocketDebug)
        std::cout << "Message received:" << message.toStdString() << std::endl;
    m_webSocket.close();
}

我是 websockets 的新手,所以我不知道问题出在哪里。谁能给个建议?

在 "ws://echo.websocket.org" 打开 websocket 对我来说很好。

这些处理程序在我的项目中就足够了:

connect(&webSocket, SIGNAL(connected()), this, SLOT(onConnected()));
connect(&webSocket, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
connect(&webSocket, SIGNAL(textMessageReceived(const QString&)), this, SLOT(onTextMessageReceived(const QString&)));

我也刚刚意识到我没有连接 error() 信号但是程序代码已经相当可靠了一年多了并且在断开连接的情况下会有连接恢复启动。也许我应该连接错误() 信号以及罕见的奇怪情况。

错误 QAbstractSocket::RemoteHostClosedError 可能只是一个正确的事情。尽量在合理的时间内得到回声。我们在我们的项目中使用的 websocket 场最多保持连接 50 分钟,因此我们在客户端和服务器之间进行乒乓以在此期间到期之前保持连接。

    // you can try that immediately after opening the web socket and also using some QTimer
    m_webSocket.sendTextMessage("Pong!");

尝试一下,只要您正在播放一些 public 回显服务,就会看到文本回复。

好吧,我验证了你的代码,它似乎工作正常。您给出的错误表明与主机相关的问题。可能是由于防火墙、isp 或其他 blocks/issues.

WebSocket server: ws://echo.websocket.org
WebSocket connected
Message received:Rock it with HTML5 WebSocket
WebSocket disconnected

我想指出的是,最好保留指向 QWebSocket 的指针 'object'。声明m_webSocketQWebSocket *,加上m_webSocket = new QWebSocket(this),非常方便。将对象视为对象是一种很好的做法。您不想不小心直接尝试 'copy' QWebSocket。此外,由于 Qt 的内部结构,如果此 "Controller" 对象被销毁而 QWebSocket 仍附加到其他对象(尽管我认为 Qt 已为此做好准备),您最终可能 运行 会遇到问题。 =14=]