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

时间:2015-11-04 22:24:14

标签: qt qtwebsockets

我想在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的新手,所以我不知道问题出在哪里。任何人都可以提供建议吗?

2 个答案:

答案 0 :(得分:1)

在“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!");

只要您正在播放一些公共回应服务,请尝试并查看文本回复。

答案 1 :(得分:1)

好吧,我验证了你的代码,它似乎工作正常。您提供的错误表示与主机相关的问题。这可能是由于防火墙,isp或其他阻塞/问题造成的。

QWebSocket *

我想指出保留指向QWebSocket'对象'的指针是首选。将m_webSocket = new QWebSocket(this)声明为df <- data.frame(a = 1:10, b = 11:20, c = 21:30, d = 51:60) # a b c d #1 1 11 21 51 #2 2 12 22 52 #3 3 13 23 53 #4 4 14 24 54 #5 5 15 25 55 #6 6 16 26 56 #7 7 17 27 57 #8 8 18 28 58 #9 9 19 29 59 #10 10 20 30 60 # Extracting rows and columns df[c(1,3,5,7,9),c(1,3)] # a c #1 1 21 #3 3 23 #5 5 25 #7 7 27 #9 9 29 并添加{{1}}非常方便。将对象视为对象是一种很好的做法。您不希望意外地尝试直接“复制”QWebSocket。此外,由于Qt的内部结构,如果在QWebSocket仍然附加到其他对象的同时销毁了这个“Controller”对象,你最终可能会遇到问题(虽然我认为Qt已经准备好了)。