以下是一个简单的 Boost.Beast WebSocket 和 TCP 服务器共存使用的示例:
#include <iostream>
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/signal_set.hpp>
namespace beast = boost::beast;
namespace websocket = beast::websocket;
namespace net = boost::asio;
using tcp = boost::asio::ip::tcp;
void handleWebSocket(websocket::stream<tcp::socket>& ws)
{
try
{
// 进行 WebSocket 握手
ws.handshake();
// 接收和输出从客户端发送的消息
beast::flat_buffer buffer;
ws.read(buffer);
std::cout << "Received message: " << beast::make_printable(buffer.data()) << std::endl;
// 发送响应消息到客户端
ws.write(net::buffer("Hello, WebSocket from server!"));
// 关闭 WebSocket 连接
ws.close(websocket::close_code::normal);
}
catch (const std::exception& e)
{
std:cerr << "WebSocket Error: " << e.what() << std:endl;
}
}
void runServer()
{
try
{
net::io_context io;
// 创建 TCP 监听器对象并绑定到指定端口号
tcp::acceptor acceptor(io, {tcp::v4(), 12345});
while (true)
{
// 等待新的连接请求到达
tcp::socket socket(io);
acceptor.accept(socket);
// 创建 WebSocket 对象来处理连接请求
websocket::stream<tcp::socket> ws(std::move(socket));
// 在新的线程中处理 WebSocket 连接
std::thread([&ws](){
handleWebSocket(ws);
}).detach();
}
}
catch (const std::exception& e)
{
std:cerr << "Server Error: " << e.what() << std:endl;
}
}
int main()
{
try
{
// 创建一个新的线程来运行 TCP 服务器
std::thread serverThread(runServer);
// 等待 CTRL-C 信号,然后退出程序
net::io_context io;
net::signal_set signals(io, SIGINT, SIGTERM);
signals.async_wait([&](const boost::system::error_code&, int){
io.stop();
serverThread.join();
});
io.run();
}
catch (const std::exception& e)
{
std:cerr << "Error: " << e.what() << std:endl;
return -1;
}
return 0;
}
这个示例代码同时创建了一个 TCP 服务器和一个 WebSocket 服务器,监听在不同的端口上。TCP 服务器监听在 12345
端口上,而 WebSocket 服务器默认监听在 8080
端口上。
当有新的连接请求到达时,TCP 服务器会创建一个 WebSocket 对象,并将其委托给单独的线程处理。处理函数 handleWebSocket()
负责进行 WebSocket 握手、接收和发送消息,并最终关闭连接。
主函数中,创建了一个新的线程来运行 TCP 服务器,并使用 Boost.ASIO 的信号集来捕获 CTRL-C 信号,在接收到该信号后停止服务器并退出程序。
请确保已经正确安装了 Boost.Beast 库,并在编译时链接相应的库文件。同样,注意在实际项目中需要处理异常、错误检查和其他边界条件等。这只是一个简单的示例来帮助你理解 Boost.Beast WebSocket 和 TCP 服务器共存的使用。
内容由零声教学AI助手提供,问题来源于学员提问