Websocket

服务器ws

#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>

#include <iostream>
#include <string>
#include <thread>

typedef websocketpp::server<websocketpp::config::asio> server_t;

void on_open(server_t* s, websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket connection opened" << std::endl;
}

void on_close(server_t* s, websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket connection closed" << std::endl;
}

void on_message(server_t* s, websocketpp::connection_hdl hdl, server_t::message_ptr msg) {
    std::cout << "Received message: " << msg->get_payload() << std::endl;
    s->send(hdl, "Hello, client!", websocketpp::frame::opcode::text);
}

void on_error(server_t* s, websocketpp::connection_hdl hdl, std::string reason) {
    std::cout << "WebSocket error: " << reason << std::endl;
}

void run_server(server_t& server) {
    server.run();
}

int main() {
    server_t server;

    server.init_asio();
    server.set_open_handler(std::bind(&on_open, &server, std::placeholders::_1));
    server.set_close_handler(std::bind(&on_close, &server, std::placeholders::_1));
    server.set_message_handler(std::bind(&on_message, &server, std::placeholders::_1, std::placeholders::_2));
    server.set_fail_handler(std::bind(&on_error, &server, std::placeholders::_1, std::placeholders::_2));

    server.listen(9001);
    server.start_accept();

    std::cout << "WebSocket server started on port 9001" << std::endl;

    // Run the server in a separate thread
    std::thread server_thread(std::bind(run_server, std::ref(server)));

    // Perform other tasks in the main thread
    // ...

    // Wait for the server thread to finish
    server_thread.join();

    return 0;
}

客户端ws

#include <websocketpp/config/asio_client.hpp>
#include <websocketpp/client.hpp>

#include <iostream>
#include <string>
#include <thread>

typedef websocketpp::client<websocketpp::config::asio_client> client_t;

void on_open(client_t* c, websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket connection opened" << std::endl;
    c->send(hdl, "Hello, server!", websocketpp::frame::opcode::text);
}

void on_close(client_t* c, websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket connection closed" << std::endl;
}

void on_message(client_t* c, websocketpp::connection_hdl hdl, client_t::message_ptr msg) {
    std::cout << "Received message: " << msg->get_payload() << std::endl;
}

void on_error(client_t* c, websocketpp::connection_hdl hdl, std::string reason) {
    std::cout << "WebSocket error: " << reason << std::endl;
}

void run_client(client_t& client) {
    client.run();
}

int main() {
    client_t client;

    client.init_asio();
    client.set_open_handler(std::bind(&on_open, &client, std::placeholders::_1));
    client.set_close_handler(std::bind(&on_close, &client, std::placeholders::_1));
    client.set_message_handler(std::bind(&on_message, &client, std::placeholders::_1, std::placeholders::_2));
    client.set_fail_handler(std::bind(&on_error, &client, std::placeholders::_1, std::placeholders::_2));

    websocketpp::lib::error_code ec;
    client.get_connection("ws://localhost:9001", ec);
    if (ec) {
        std::cout << "Could not create connection: " << ec.message() << std::endl;
        return 1;
    }
    client.connect(ec);
    if (ec) {
        std::cout << "Could not connect: " << ec.message() << std::endl;
        return 1;
    }

    std::cout << "WebSocket client connected" << std::endl;

    // Run the client in a separate thread
    std::thread client_thread(std::bind(run_client, std::ref(client)));

    // Perform other tasks in the main thread
    // ...

    // Wait for the client thread to finish
    client_thread.join();

    return 0;
}

服务器wss

#include <websocketpp/config/asio_tls.hpp>
#include <websocketpp/server.hpp>

#include <iostream>
#include <string>
#include <thread>

typedef websocketpp::server<websocketpp::config::asio_tls> server_t;

void on_open(server_t* s, websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket connection opened" << std::endl;
}

void on_close(server_t* s, websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket connection closed" << std::endl;
}

void on_message(server_t* s, websocketpp::connection_hdl hdl, server_t::message_ptr msg) {
    std::cout << "Received message: " << msg->get_payload() << std::endl;
    s->send(hdl, "Hello, client!", websocketpp::frame::opcode::text);
}

void on_error(server_t* s, websocketpp::connection_hdl hdl, std::string reason) {
    std::cout << "WebSocket error: " << reason << std::endl;
}

void run_server(server_t& server) {
    server.run();
}

int main() {
    server_t server;

    // Load SSL/TLS certificate and private key
    server.set_tls_init_handler([](websocketpp::connection_hdl) {
        auto sslContext = websocketpp::lib::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::tlsv12);
        sslContext->set_options(boost::asio::ssl::context::default_workarounds |
                               boost::asio::ssl::context::no_sslv2 |
                               boost::asio::ssl::context::no_sslv3);
        sslContext->set_password_callback([](size_t, boost::asio::ssl::context_base::password_purpose) {
            return "your_password";
        });
        sslContext->use_certificate_chain_file("path/to/certificate.pem");
        sslContext->use_private_key_file("path/to/private_key.pem", boost::asio::ssl::context::pem);
        return sslContext;
    });

    server.init_asio();
    server.set_open_handler(std::bind(&on_open, &server, std::placeholders::_1));
    server.set_close_handler(std::bind(&on_close, &server, std::placeholders::_1));
    server.set_message_handler(std::bind(&on_message, &server, std::placeholders::_1, std::placeholders::_2));
    server.set_fail_handler(std::bind(&on_error, &server, std::placeholders::_1, std::placeholders::_2));

    server.listen(9001, true); // Use wss://
    server.start_accept();

    std::cout << "WebSocket server started on port 9001 (wss://)" << std::endl;

    // Run the server in a separate thread
    std::thread server_thread(std::bind(run_server, std::ref(server)));

    // Perform other tasks in the main thread
    // ...

    // Wait for the server thread to finish
    server_thread.join();

    return 0;
}

客户端wss

#include <websocketpp/config/asio_client.hpp>
#include <websocketpp/client.hpp>

#include <iostream>
#include <string>
#include <thread>

typedef websocketpp::client<websocketpp::config::asio_tls_client> client_t;

void on_open(client_t* c, websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket connection opened" << std::endl;
    c->send(hdl, "Hello, server!", websocketpp::frame::opcode::text);
}

void on_close(client_t* c, websocketpp::connection_hdl hdl) {
    std::cout << "WebSocket connection closed" << std::endl;
}

void on_message(client_t* c, websocketpp::connection_hdl hdl, client_t::message_ptr msg) {
    std::cout << "Received message: " << msg->get_payload() << std::endl;
}

void on_error(client_t* c, websocketpp::connection_hdl hdl, std::string reason) {
    std::cout << "WebSocket error: " << reason << std::endl;
}

void run_client(client_t& client) {
    client.run();
}

int main() {
    client_t client;

    // Load SSL/TLS certificate
    client.set_tls_init_handler([](websocketpp::connection_hdl) {
        auto sslContext = websocketpp::lib::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::tlsv12);
        sslContext->set_options(boost::asio::ssl::context::default_workarounds |
                               boost::asio::ssl::context::no_sslv2 |
                               boost::asio::ssl::context::no_sslv3);
        sslContext->load_verify_file("path/to/trusted_ca_certificates.pem");
        return sslContext;
    });

    client.init_asio();
    client.set_open_handler(std::bind(&on_open, &client, std::placeholders::_1));
    client.set_close_handler(std::bind(&on_close, &client, std::placeholders::_1));
    client.set_message_handler(std::bind(&on_message, &client, std::placeholders::_1, std::placeholders::_2));
    client.set_fail_handler(std::bind(&on_error, &client, std::placeholders::_1, std::placeholders::_2));

    websocketpp::lib::error_code ec;
    client.get_connection("wss://localhost:9001", ec);
    if (ec) {
        std::cout << "Could not create connection: " << ec.message() << std::endl;
        return 1;
    }
    client.connect(ec);
    if (ec) {
        std::cout << "Could not connect: " << ec.message() << std::endl;
        return 1;
    }

    std::cout << "WebSocket client connected" << std::endl;

    // Run the client in a separate thread
    std::thread client_thread(std::bind(run_client, std::ref(client)));

    // Perform other tasks in the main thread
    // ...

    // Wait for the client thread to finish
    client_thread.join();

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值