Тестовое приложение Qt5 WebSockets не подключается к тестовой службе

Я хотел открыть веб-сокет QT для службы тестирования в ws://echo.websocket.org но я получил ошибку QAbstractSocket::RemoteHostClosedErrorЯ подключаю сигнал error(QAbstractSocket::SocketError socketError) в слот в моем коде, чтобы прочитать номер ошибки, а затем найти его здесь

Мой код выглядит так

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 ответа

Решение

Открытие websocket по адресу "ws://echo.websocket.org" работает для меня просто отлично.

Этих обработчиков достаточно в моем проекте:

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(), но программный код достаточно надежен уже более года, и в случае разъединения происходит восстановление соединения. Возможно, мне следует также подключить сигнал error() для нечастых странных случаев.

Ошибка QAbstractSocket::RemoteHostClosedError может быть просто правильной вещью. Попробуйте получить эхо в разумные сроки. Ферма веб-сокетов, которую мы используем в нашем проекте, удерживает соединение до 50 минут, поэтому мы выполняем пинг-понг между клиентом и сервером, чтобы поддерживать соединение в действии до истечения этого периода.

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

Попробуйте это и посмотрите текстовый ответ, пока вы играете в какой-либо публичной службе эха.

Ну, я проверил ваш код, и он, кажется, работает нормально. Указанная ошибка указывает на проблему с хостом. Это может быть связано с брандмауэром, ISP или другими блоками / проблемами.

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

Я хотел бы отметить, что предпочтительнее хранить указатель на объект QWebSocket. Это очень удобно объявить m_webSocket как QWebSocket *, и добавить m_webSocket = new QWebSocket(this), Это хорошая практика, чтобы рассматривать объекты как объекты. Вы не хотите случайно попытаться "скопировать" QWebSocket напрямую. Кроме того, из-за внутренних свойств Qt вы можете в конечном итоге столкнуться с проблемами, если этот объект "Controller" будет уничтожен, в то время как QWebSocket все еще присоединен к другим объектам (хотя я думаю, что Qt подготовлен для этого).

Другие вопросы по тегам