【问题标题】:How to catch websocket connection error如何捕获 websocket 连接错误
【发布时间】:2016-01-06 04:04:47
【问题描述】:

我正在从 Qt/c++ 客户端打开一个 url,例如,

m_webSocket = new QWebSocket();
m_webSocket->open("wss://192.123.1.44:8087");

我想捕获连接中的任何错误。我怎么做? 我已经连接到信号 QWebSocket:error(QAbstractSocket::SocketError error),但即使我的服务器没有运行,我也不会触发它。

编辑: 我正在连接到错误信号,如下所示,

m_webSocket = new QWebSocket();
connect(m_webSocket, SIGNAL(error(QAbstractSocket::SocketError error)), this, SLOT(onWebSocketError(QAbstractSocket::SocketError error)));
m_webSocket->open(url);

这似乎不起作用。

【问题讨论】:

    标签: c++ qt websocket


    【解决方案1】:

    在打开套接字之前连接到 QWebSocket error 信号。

    QWebSocket* pWebSocket = new QWebSocket;
    connect(pWebSocket, &QWebSocket::error, [=](QAbstractSocket::SocketError error)
    {
        // Handle error here...
        qDebug() << pWebSocket->errorString();
    }
    
    pWebSocket->open("wss://192.123.1.44:8087");
    

    请注意,此连接使用 lambda 函数,它需要 C++ 11。以通常的方式连接到插槽也可以。

    如果没有 C++ 11,请使用标准 (Qt 5) 连接:-

    class MyClass : public QObject
    {
       Q_OBJECT
    
       public:
           MyClass(QUrl url);
    
       protected slots:
           void Error(QAbstractSocket::SocketError error);
    
       private:
           QWebSocket* pWebSocket;
    };
    
    
    MyClass::MyClass(QUrl url)
    {        
        QWebSocket* pWebSocket = new QWebSocket;
        connect(pWebSocket, &QWebSocket::error, pMyClass, &MyClass::Error);
        m_webSocket->open(url);
    }
    

    由于QObject::connect 返回一个QMetaObjectConnection,其中包含一个overloaded bool operator,您可以检查连接调用的返回,以确保找到有效的信号和槽,并提供有效的参数:-

    // Old-style connection
    if(!connect(m_webSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onWebSocketError(QAbstractSocket::SocketError))) )
    {
        qDebug() << "Failed to connect to QWebSocket::error" <<  endl;
    }
    

    但是,这在很大程度上是多余的,因为失败的连接通常会在 Qt 的连接调用中产生调试输出,通知您此问题。

    注意,在旧式连接语法中,参数列表不命名参数,只提供类型。添加名称会导致连接失败。

    【讨论】:

    • 感谢您的回复。我已经编辑了我的问题。请看一下,让我知道这是否是处理错误信号的正确方法。
    • 是的,但是如果你使用的是Qt 5,最好使用新的连接语法,如果错了会在编译时出错; connect(m_webSocket, &QWebSocket::error, this, &MyClass:: onWebSocketError);
    • 我已经连接到编辑中提到的错误信号。仍然无法捕捉到错误。
    • 如果您使用的是 Qt SIGNAL 和 SLOT 宏,请检查连接调用的返回。
    • 我仍然无法找出问题所在。
    【解决方案2】:

    documentation中所述:

    注意:这个类中重载了信号错误。为了使用函数指针语法连接到这个信号,Qt 提供了一个方便的帮助器来获取函数指针,如下例所示:

    connect(webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
    [=](QAbstractSocket::SocketError error){ /* ... */ });
    

    当然,您可以连接到普通函数而不是 lambda 函数,但 QOverload 部分很重要。

    【讨论】:

    • 这就是我需要的魔法。我无法让编译器停止抱怨。谢谢。
    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2015-12-02
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    相关资源
    最近更新 更多