簡體   English   中英

Qt 和 Node JS 通過 WebSockets 網絡通信

[英]Qt and Node JS network communication through WebSockets

我想用 Qt(C++) 程序連接我的 Node JS 應用程序,我將 Socket.io 用於節點 JS(服務器)和 QWebSocket 用於 Qt 程序(客戶端)。

但經過我所有的試驗,我無法開始工作。 它向我顯示了客戶端的錯誤:

QAbstractSocket::RemoteHostClosedError

從服務器端,沒有傳入連接的跡象。

這是我為此目的的源代碼:

節點JS服務器:

var io = require('socket.io')(8082);

io.on('connection', function (socket) {
  io.emit('this', 'Hey Welcome!');
   console.log("New connection!");

  socket.on('private message', function (from, msg) {
    console.log('I received a private message by ', from, ' saying ', msg);
  });

  socket.on('disconnect', function () {
    io.emit('user disconnected');
  });
});

Qt C++ 客戶端:

    #include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) : QWidget(parent),  ui(new Ui::Widget)
{
    ui->setupUi(this);

    webSocket  = new QWebSocket();

    webSocket->open(QUrl(("ws://localhost:8082")));

    connect(webSocket, SIGNAL(connected()), this, SLOT(isConnected()));
    connect(webSocket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslError(QList<QSslError>)));
    connect(webSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(logError(QAbstractSocket::SocketError)));
    connect(webSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(newMessage(QString)));
    connect(webSocket, SIGNAL(textFrameReceived(QString,bool)), this, SLOT(newMessageBit(QString,bool)));
}

Widget::~Widget()
{
    delete ui;
}


void Widget::isConnected()
{
    webSocket->sendTextMessage("Hello From Qt!!!");
}

void Widget::logError(QAbstractSocket::SocketError err)
{
    qDebug() << "Error: ";
    qDebug() << err;
}

void Widget::sslError(QList<QSslError> errors)
{
    qDebug() << "SSLError: ";
    qDebug() << errors;
    webSocket->ignoreSslErrors(errors);
}


void Widget::newMessage(QString msg)
{
    qDebug() << msg;
}

void Widget::newMessageBit(QString msg, bool isLast)
{
    qDebug() << msg;
    qDebug() << isLast;
}

我也從調試控制台收到這些錯誤(在運行時)

QSslSocket: cannot resolve TLSv1_1_client_method
QSslSocket: cannot resolve TLSv1_2_client_method
QSslSocket: cannot resolve TLSv1_1_server_method
QSslSocket: cannot resolve TLSv1_2_server_method
QSslSocket: cannot resolve SSL_select_next_proto
QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
QSslSocket: cannot resolve SSL_get0_next_proto_negotiated

雖然我遲到了,但如果有人也面臨這個問題(不包括 ssl 錯誤),它可能會有用。 首先,socket.io 與 Qt(或 c++、java、php 或任何其他語言)使用的標准 websocket 不兼容。 如果您在服務器上使用 socket.io,那么您只能使用 socket.io 特定的客戶端庫,而不是標准的 websocket 庫。

其他語言有幾個 socket.io 特定的客戶端庫 -

Java: https://github.com/socketio/socket.io-client-java
C++: https://github.com/socketio/socket.io-client-cpp
Swift: https://github.com/socketio/socket.io-client-swift
Dart: https://github.com/rikulo/socket.io-client-dart
Python: https://github.com/miguelgrinberg/python-socketio
.Net: https://github.com/Quobject/SocketIoClientDotNet

您系統上的 OpenSSL 動態庫很可能與 Qt 構建時使用的庫不兼容。 你用的是什么Qt版本? 由於您尚未指定操作系統,因此很難判斷這是否是因為系統本身提供了舊版本的 OpenSSL,但我建議使用任何可用的轉儲工具在您的 OpenSSL 庫中查找符號(例如 SSL_get0_next_proto_negotiated)如果它們不存在 - 降級 Qt 或升級 OpenSSL。

如前所述這里-從Qt的5.2及以上則至少需要OpenSSL的1.0.0,舊版本可能會失敗。

更新

正如我懷疑您為 SSL 獲得的錯誤確實是由於錯誤的 OpenSSL 二進制文件造成的。 您可以從Shining Light Productions站點獲取適用於 Windows 的 1.0.0+ 庫,但這只能修復 OpenSSL 錯誤。 我拿了你的例子並添加了額外的插槽,似乎stateChanged信號是用狀態QAbstractSocket::ConnectingState觸發的,但之后沒有任何反應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM