C++ Qt和Node JS通过WebSocket进行网络通信

C++ Qt和Node JS通过WebSocket进行网络通信,c++,node.js,qt,websocket,network-programming,C++,Node.js,Qt,Websocket,Network Programming,我想将我的Node JS应用程序与Qt(C++)程序连接,我正在使用Socket.io作为Node JS(服务器)和QWebSocket作为Qt程序(客户端) 但在经历了所有的考验之后,我没有去工作。它显示了客户端的错误: QAbstractSocket::RemoteHostClosedError 从服务器端看,没有传入连接的迹象 以下是我的源代码: 节点JS服务器: var io = require('socket.io')(8082); io.on('connection', funct

我想将我的Node JS应用程序与Qt(C++)程序连接,我正在使用Socket.io作为Node 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');
  });
});
< Q> 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;
}

系统上的OpenSSL动态库很可能与构建Qt时使用的库不兼容。您使用的是什么Qt版本?由于您没有指定操作系统,很难判断这是否是因为系统本身提供了OpenSSL的旧版本,但我建议查找符号(例如SSL\u get0\u next\u proto\u)在OpenSSL库中,使用任何可用的转储工具,如果没有这些工具,请降级Qt或升级OpenSSL

如上所述-从Qt5.2及更高版本开始,您至少需要OpenSSL 1.0.0,旧版本可能会失败

更新


正如我所怀疑的,SSL的错误实际上是由于错误的OpenSSL二进制文件造成的。您可以从该站点获取windows的1.0.0+库,但这只能修复OpenSSL错误。我以您的示例为例,添加了额外的插槽,似乎
stateChanged
信号是通过state
QAbstractSocket::ConnectingState
触发的,但之后什么也没有发生。

虽然我参加聚会迟到了,但如果有人也面临这个问题(不包括ssl错误),这可能是有用的。首先,SokKi.IO与QT(或C++、java、PHP或任何其他语言)所使用的标准WebSoCub不兼容。如果您在服务器上使用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为什么要使用它。我正在用Qt5.4运行Windows7。我从未在我的系统上安装过OpenSSL;我想我只需要安装它。但如果是这样,所有其他用户也需要安装它才能使用我的progrem;不可能只禁用SSL吗?@Xsmael我对WebSocket不太熟悉,但似乎您使用的是
ws
url而不是
wss
,所以是的,套接字不应该使用SSL安全性。虽然对socket.io不太确定-也许默认情况下它启用了SSL,我需要用谷歌搜索一下。@Xsmael-你有没有可能使用Wireshark来看看发生了什么?@Xsmael-据我在Wireshark中看到的,最初的GET请求没有发送-不知道为什么。非常感谢你付出了这么多的努力和时间,我也尝试了Wireshark,但没有提供太多帮助,但是很明显,Qt和Socket.io(node js)之间在websocket协议实现方面有一个图标兼容性。所以我尝试了其他库,我得到了一个有效的库(ws)。关于OpenSSL警告,您确实是对的,但显然,正如您所发现的,他们对通信失败不负责任。请参阅我们不使用ssl,但安装正确的库会清除这些警告。谢谢
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