C++ QWebSocket Hello世界示例

C++ QWebSocket Hello世界示例,c++,qt,networking,websocket,server,C++,Qt,Networking,Websocket,Server,我正在尝试在项目中使用QWebSocket。我写了一个小的“Hello World”示例来测试它是如何工作的。问题是:我可以启动WebSocket服务器,但客户端无法连接到它。我的客户端进入QAbstractSocket::ConnectionState,但从未真正连接 #if !defined(RAVI_SERVER_WEBSOCKETCLIENT_HPP) #define RAVI_SERVER_WEBSOCKETCLIENT_HPP //Qt includes //WebSock

我正在尝试在项目中使用QWebSocket。我写了一个小的“Hello World”示例来测试它是如何工作的。问题是:我可以启动WebSocket服务器,但客户端无法连接到它。我的客户端进入QAbstractSocket::ConnectionState,但从未真正连接

#if !defined(RAVI_SERVER_WEBSOCKETCLIENT_HPP)
#define RAVI_SERVER_WEBSOCKETCLIENT_HPP

//Qt includes
    //WebSocket
    #include <QtWebSockets/QWebSocketServer>
    #include <QtWebSockets/QWebSocket>
    //Util
    #include <QObject>
    #include <QDebug>

namespace ravi{
    namespace server{
        class WebSocketClient : public QObject{
            public:
                WebSocketClient(const QUrl &url, QObject* parent = nullptr);
            private slots:
                void handle_new_connection();
                void handle_close_connection();
                void handle_new_text_message();
                void handle_ssl_errors(const QList<QSslError> &errors);
                QWebSocket _socket;
        };
    }
}

#endif // RAVI_SERVER_WEBSOCKETCLIENT_HPP
#如果!已定义(RAVI_服务器_WEBSOCKETCLIENT_HPP)
#定义RAVI_服务器_WEBSOCKETCLIENT_HPP
//Qt包括
//网袋
#包括
#包括
//利用率
#包括
#包括
名称空间拉维{
命名空间服务器{
类WebSocketClient:公共QObject{
公众:
WebSocketClient(常量QUrl&url,QObject*parent=nullptr);
专用插槽:
无效句柄\新\连接();
无效句柄\关闭\连接();
void handle_new_text_message();
无效句柄\u ssl\u错误(常量QList和错误);
QWebSocket_插座;
};
}
}
#endif//RAVI_SERVER_WEBSOCKETCLIENT_HPP
#包括“WebSocketClient.hpp”
ravi::server::WebSocketClient::WebSocketClient(常量QUrl&url,QObject*parent):
QObject(父对象),
_套接字(){
连接(&_套接字,QOverload::of(&QWebSocket::error),
[=](QAbstractSocket::SocketError错误){
qDebug()您有两个错误:

  • 如果不将客户机对象分配给变量,那么它将立即被销毁
  • Qt需要一个eventloop来让信号、事件等工作,在这种情况下,一个QCoreApplication就足够了
#包括“source/server/WebSocketClient.hpp”
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
ravi::server::WebSocketClient客户端(QUrl(“ws://127.0.0.1:8888”);
返回a.exec();
}
#包括“source/server/WebSocketServer.hpp”
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
ravi::server::WebSocketServer服务器(8888);
返回a.exec();
}

另一方面,我觉得奇怪的是
auto-ws\u-server=ravi::server::WebSocketServer(8888);
不会生成编译错误,因为作为一个websocket服务器,QObject不应该允许复制构造函数。

谢谢你的帮助。我现在就开始工作了。我有一个应用程序,我想同时运行http和websocket服务器。为了保持它干净,我抽象了我的体系结构,以便某个类现在有一个http是一个websocket服务器。这样做之后,websocket服务器再次停止工作。我想我必须为websocket提供一个eventloop,因为在QCoreApplication中包装hole应用程序没有任何作用。我该怎么做?
#include "WebSocketClient.hpp"

ravi::server::WebSocketClient::WebSocketClient(const QUrl &url, QObject* parent):
QObject(parent),
_socket(){
    connect(&_socket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
    [=](QAbstractSocket::SocketError error){
        qDebug() << "Error";
    });
    connect(&_socket, &QWebSocket::connected, this, &WebSocketClient::handle_new_connection);
    connect(&_socket, &QWebSocket::disconnected, this, &WebSocketClient::handle_close_connection);
    connect(&_socket, QOverload<const QList<QSslError>&>::of(&QWebSocket::sslErrors),
            this, &WebSocketClient::handle_ssl_errors);
    qDebug() << url.path();
    qDebug() << url.port();
    qDebug() << url.url();
    qDebug() << url.host();
    _socket.open(url);
    qDebug() << _socket.state();
}


void ravi::server::WebSocketClient::handle_new_connection(){
    qDebug() << "New Connection";

    _socket.sendTextMessage(QStringLiteral("Hello, world!"));
    connect(&_socket, &QWebSocket::textMessageReceived,
            this, &WebSocketClient::handle_new_text_message);
}

void ravi::server::WebSocketClient::handle_close_connection(){
    qDebug() << "Closed Connection";
}

void ravi::server::WebSocketClient::handle_new_text_message(){
    qDebug() << "New Text Message";
}

void ravi::server::WebSocketClient::handle_ssl_errors(const QList<QSslError> &errors){
    Q_UNUSED(errors);
    qDebug() << "SSL";
    _socket.ignoreSslErrors();
}
#include "source/server/WebSocketClient.hpp"
#include <iostream>
int main(int argc, char const *argv[])
{
    ravi::server::WebSocketClient(QUrl("ws://127.0.0.1:8888"));
    std::string line;
    std::getline(std::cin, line);

}

#if !defined(RAVI_SERVER_WEBSOCKETSERVER_HPP)
#define RAVI_SERVER_WEBSOCKETSERVER_HPP

//Qt includes
//WebSocket
#include <QtWebSockets/QWebSocketServer>
#include <QtWebSockets/QWebSocket>
//Util
#include <QObject>
#include <QDebug>

namespace ravi{
    namespace server{
        class WebSocketServer : public QObject{
            Q_OBJECT
            public:
                WebSocketServer(int port, QObject* parent = nullptr);
            private:
                void handle_new_connection();
                void handle_close_connection();
                void handle_text_message();
                void handle_binary_message();
                void handle_disconnect();

                QWebSocketServer* _ws_server;
                std::vector<QWebSocket*> _clients;
        };
    }
}

#endif // RAVI_SERVER_WEBSOCKETSERVER_HPP

#include "WebSocketServer.hpp"

ravi::server::WebSocketServer::WebSocketServer(int port, QObject* parent):
    QObject(parent),
    _ws_server(new QWebSocketServer("WebSocket Server", QWebSocketServer::NonSecureMode, this)){
    if(_ws_server->listen(QHostAddress::Any, port)){
        qDebug() << "Connect handlers";
        connect(_ws_server, &QWebSocketServer::newConnection, this, &WebSocketServer::handle_new_connection);
        connect(_ws_server, &QWebSocketServer::closed, this, &WebSocketServer::handle_close_connection);
    }
    if(_ws_server->isListening()){
        qDebug() << "Still Listening";
    }
}


void ravi::server::WebSocketServer::handle_new_connection(){
    qDebug() << "New Connection";
    QWebSocket *client = _ws_server->nextPendingConnection();

    connect(client, &QWebSocket::textMessageReceived, this, &WebSocketServer::handle_text_message);
    connect(client, &QWebSocket::binaryMessageReceived, this, &WebSocketServer::handle_binary_message);
    connect(client, &QWebSocket::disconnected, this, &WebSocketServer::handle_disconnect);

    _clients.push_back(client);
}

void ravi::server::WebSocketServer::handle_close_connection(){
    qDebug() << "Closed Connection";
}

void ravi::server::WebSocketServer::handle_text_message(){

}

void ravi::server::WebSocketServer::handle_binary_message(){

}

void ravi::server::WebSocketServer::handle_disconnect(){

}



#include "source/server/WebSocketServer.hpp"
#include <iostream>

int main(int argc, char const *argv[])
{
    auto ws_server = ravi::server::WebSocketServer(8888);

    std::string line;
    std::getline(std::cin, line);


    return 0;
}

#include "source/server/WebSocketClient.hpp"

#include <QCoreApplication>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ravi::server::WebSocketClient client(QUrl("ws://127.0.0.1:8888"));
    return a.exec();
}
#include "source/server/WebSocketServer.hpp"

#include <QCoreApplication>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ravi::server::WebSocketServer server(8888);
    return a.exec();
}