以下是一个使用 Boost.Beast 实现 WebSocket 和 TCP 服务器共存的示例,分别监听在TCP 9000端口和WebSocket 9001端口:
#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 handleTcp(tcp::socket& socket)
{
try
{
// 接收和输出从客户端发送的消息
char data[1024];
size_t length = socket.read_some(boost::asio::buffer(data));
std:cout << "Received message: " << data << std:endl;
// 发送响应消息到客户端
boost::system::error_code ignored_error;
socket.write_some(boost.asio.buffer("Hello, TCP from server!"), ignored_error);
// 关闭 TCP 连接
socket.shutdown(tcp::socket::shutdown_both);
socket.close();
}
catch (const std::exception& e)
{
std:cerr << "TCP Error: " << e.what() << std:endl;
}
}
void runServer()
{
try
{
net::io_context io;
// 创建 TCP 监听器对象并绑定到指定端口号
tcp::acceptor tcpAcceptor(io, {tcp::v4(), 9000});
// 创建 WebSocket 监听器对象并绑定到指定端口号
tcp::acceptor wsAcceptor(io, {tcp::v4(), 9001});
while (true)
{
// 等待新的 TCP 连接请求到达
tcp::socket tcpSocket(io);
tcpAcceptor.accept(tcpSocket);
// 在新的线程中处理 TCP 连接
std::thread([&tcpSocket]() {
handleTcp(tcpSocket);
}).detach();
// 等待新的 WebSocket 连接请求到达
tcp::socket wsSocket(io);
wsAcceptor.accept(wsSocket);
// 创建 WebSocket 对象来处理连接请求
websocket::stream<tcp::socket> ws(std::move(wsSocket));
// 在新的线程中处理 WebSocket 连接
std::thread([&ws](){
handleWebSocket(ws);
}).detach();
}
}
catch (const std::exception& e)
{
std:cerr << "Server Error: " << e.what() << std:endl;
}
}
int main()
{
try
{
// 创建一个新的线程来运行服务器
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服务器监听9000端口,WebSocket服务器监听9001端口。当有新的TCP连接请求到达时,将在一个新线程中处理TCP连接;同样地,当有新的WebSocket连接请求到达时,将在另一个新线程中处理WebSocket连接。分别使用handleTcp()
函数和handleWebSocket()
函数来处理对应的连接。
请确保已正确安装了Boost.Beast库,并在编译时链接相应的库文件。同时注意,在实际项目中需要处理异常、错误检查以及其他边界条件等。这只是一个简单的示例用于帮助您理解如何使用Boost.Beast实现WebSocket和TCP服务器共存。
内容由零声教学AI助手提供,问题来源于学员提问