Qt实现websocket通信——服务端

 1、头文件

#ifndef WEBSOCKETSERVER_H
#define WEBSOCKETSERVER_H

#include <QObject>
#include <QWebSocketServer>
#include <QWebSocket>

class WebSocketServer : public QObject
{
    Q_OBJECT
public:
    explicit WebSocketServer(QObject *parent = nullptr);
    ~WebSocketServer();

signals:
    void msgReceived(const QString &msg);

private slots:
    void onNewConnection(void);
    void onDisconnected(void);
    void onErrorOccurred(QAbstractSocket::SocketError socketError);

private:
    QWebSocket * m_socket;
    QWebSocketServer * m_server;
};

#endif // WEBSOCKETSERVER_H

2、源码文件

#include "websocketserver.h"
#include <QHostAddress>

WebSocketServer::WebSocketServer(QObject *parent)
    : QObject{parent}
{
    m_socket = nullptr;
    m_server = new QWebSocketServer("server", QWebSocketServer::NonSecureMode, this);
    if(m_server->listen(QHostAddress::LocalHost, 8088))
    {
        connect(m_server, &QWebSocketServer::newConnection, this, &WebSocketServer::onNewConnection);
    }
}

WebSocketServer::~WebSocketServer()
{
    onDisconnected();
    if(nullptr != m_server)
    {
        m_server->disconnect();
        m_server->close();
        delete m_server;
        m_server = nullptr;
    }
}

void WebSocketServer::onNewConnection(void)
{
    if(nullptr != m_server)
    {
        onDisconnected();
        m_socket = m_server->nextPendingConnection();
        if(nullptr != m_socket)
        {
            connect(m_socket, &QWebSocket::disconnected, this, &WebSocketServer::onDisconnected);
            connect(m_socket, &QWebSocket::textMessageReceived, this, [=](const QString &msg){
                emit msgReceived(msg);
            });
            connect(m_socket, &QWebSocket::binaryMessageReceived, this, [=](const QByteArray &msg){
                emit msgReceived(msg);
            });
            connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onErrorOccurred(QAbstractSocket::SocketError)));
        }
    }
}

void WebSocketServer::onDisconnected()
{
    if(nullptr != m_socket)
    {
        m_socket->disconnect();
        delete m_socket;
        m_socket = nullptr;
    }
}

void WebSocketServer::onErrorOccurred(QAbstractSocket::SocketError socketError)
{
    qDebug()<<QString("Websocketserver error(%1): ").arg(socketError)<<m_socket->errorString();
}

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++实现WebSocket客户端和服务端,通常需要使用第三方库来简化操作。以下是使用两个流行的C++ WebSocket库的示例代码: 1. 使用Boost.Beast库实现WebSocket客户端和服务端WebSocket客户端: ```c++ #include <boost/beast/core.hpp> #include <boost/beast/websocket.hpp> #include <boost/asio/connect.hpp> #include <boost/asio/ip/tcp.hpp> #include <iostream> namespace beast = boost::beast; namespace http = beast::http; namespace websocket = beast::websocket; namespace net = boost::asio; using tcp = boost::asio::ip::tcp; int main(int argc, char** argv) { net::io_context ioc; tcp::resolver resolver(ioc); websocket::stream<tcp::socket> ws(ioc); auto const results = resolver.resolve("echo.websocket.org", "80"); boost::asio::connect(ws.next_layer(), results.begin(), results.end()); ws.handshake("echo.websocket.org", "/"); ws.write(net::buffer(std::string("Hello, world!"))); beast::flat_buffer buffer; ws.read(buffer); std::cout << beast::make_printable(buffer.data()) << std::endl; ws.close(websocket::close_code::normal); } ``` WebSocket服务端: ```c++ #include <boost/beast/core.hpp> #include <boost/beast/websocket.hpp> #include <boost/asio/ip/tcp.hpp> #include <iostream> namespace beast = boost::beast; namespace http = beast::http; namespace websocket = beast::websocket; namespace net = boost::asio; using tcp = boost::asio::ip::tcp; int main(int argc, char** argv) { net::io_context ioc; tcp::acceptor acceptor(ioc, tcp::endpoint(tcp::v4(), 8080)); while (true) { tcp::socket socket(ioc); acceptor.accept(socket); try { websocket::stream<tcp::socket> ws(std::move(socket)); ws.accept(); beast::flat_buffer buffer; ws.read(buffer); ws.text(ws.got_text()); ws.write(buffer.data()); } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } } } ``` 2. 使用Simple-Websocket-Server库实现WebSocket客户端和服务端WebSocket客户端: ```c++ #include "websocket.h" int main(int argc, char** argv) { auto client = std::make_shared<SimpleWeb::SocketClient<SimpleWeb::WS>>(); client->on_open = [](std::shared_ptr<SimpleWeb::SocketClient<SimpleWeb::WS>> client) { std::cout << "Connected to server!" << std::endl; client->send("Hello, world!"); }; client->on_message = [](std::shared_ptr<SimpleWeb::SocketClient<SimpleWeb::WS>> client, std::shared_ptr<SimpleWeb::WS::Message> message) { std::cout << "Received message: " << message->string() << std::endl; client->close(); }; client->connect("echo.websocket.org", 80); } ``` WebSocket服务端: ```c++ #include "websocket.h" int main(int argc, char** argv) { auto server = std::make_shared<SimpleWeb::SocketServer<SimpleWeb::WS>>(); server->on_message = [](std::shared_ptr<SimpleWeb::SocketServer<SimpleWeb::WS>::Connection> connection, std::shared_ptr<SimpleWeb::WS::Message> message) { std::cout << "Received message: " << message->string() << std::endl; connection->send(message->string()); }; server->start(); } ``` 请注意,这只是WebSocket客户端和服务端实现的基本示例。使用时需要根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值