Demo:WebSocket 回显
可构建、可运行、可验证,并与仓库 examples 目录中的源码保持一致。
1. 示例内容
完整源码中的关键调用均有中文注释,页面同时给出运行命令、验证方法和可调整参数。
2. 构建与运行
cmake --build build --target sttnet_websocket_echo --parallel
./build/examples/sttnet_websocket_echo3. 运行结果
使用浏览器 WebSocket 客户端或 websocat 连接 ws://127.0.0.1:5050/echo预期:服务端回显文本帧和二进制帧。
4. 完整源码
#include <sttnet.h>
#include <iostream>
#include <string_view>
int main()
{
using namespace stt::network;
using namespace stt::data;
using stt::system::ServerSetting;
if(!ServerSetting::blockTerminationSignals())
{
std::cerr << "failed to block termination signals\n";
return 1;
}
WebSocketServer server;
// 握手判定函数检查 HTTP Upgrade 请求。
// 本 Demo 只接受 /echo 和可选查询参数。
server.setJudgeFunction(
[](WebSocketFDInformation &connection) {
const bool correctPath =
connection.locPara == "/echo" ||
connection.locPara.rfind("/echo?", 0) == 0;
// 真实服务还可以在这里检查 connection.header,例如
// 使用 HttpStringUtil::get_value_header()。
return correctPath;
});
// 全局回调接收未使用自定义 key 路由的消息。
// 它返回 bool;false 表示消息处理失败。
server.setGlobalSolveFunction(
[](WebSocketServerFDHandler &client,
WebSocketFDInformation &message) {
// RFC 6455 中 opcode 1 是文本,opcode 2 是二进制。
const std::string frameType =
message.message_type == 2 ? "0010" : "0001";
// 使用相同的文本/二进制帧类型回显负载。
return client.sendMessage(message.message, frameType);
});
// 关闭空闲连接,并要求 30 秒内返回心跳响应。
server.setTimeOutTime(20); // 空闲超时,单位分钟。
server.setHBTimeOutTime(30); // 心跳响应超时,单位秒。
if(!server.startListen(5050))
{
std::cerr << "failed to listen on port 5050\n";
return 2;
}
std::cout << "WebSocket echo listening on ws://127.0.0.1:5050/echo\n";
ServerSetting::waitForTerminationSignal();
return server.close() ? 0 : 3;
}