服务器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;
}