1#ifndef NEFORCE_NETWORK_HTTP_WEBSOCKET_HPP__
2#define NEFORCE_NETWORK_HTTP_WEBSOCKET_HPP__
20NEFORCE_BEGIN_NAMESPACE__
131class NEFORCE_API websocket_server {
139 mutable mutex sessions_mutex_;
142 websocket_server() =
default;
143 ~websocket_server() =
default;
145 websocket_server(
const websocket_server&) =
delete;
146 websocket_server& operator=(
const websocket_server&) =
delete;
148 websocket_server(websocket_server&&) noexcept = default;
149 websocket_server& operator=(websocket_server&&) noexcept = default;
185 return sessions_.size();
233 string fragment_buffer_;
235 bool in_fragment_ =
false;
238 atomic<int64_t> last_pong_ms_{0};
240 message_handler on_message_;
241 close_handler on_close_;
242 error_handler on_error_;
244 bool queue_frame(
byte_vector frame,
bool is_control =
false);
245 void write_loop() noexcept;
247 void read_loop() noexcept;
248 bool read_frame() noexcept;
250 bool dispatch(const websocket_frame_header& hdr,
websocket_opcode opcode,
string payload);
254 void handle_close_frame(
string payload);
256 void heartbeat_loop() noexcept;
314 bool is_open() const noexcept {
return running_ && socket_->is_open(); }
364NEFORCE_END_NAMESPACE__
void route(const string &path, session_handler handler)
注册WebSocket路由
size_t session_count() const noexcept
获取活动会话数量
bool handle_upgrade(const http_request &request, unique_ptr< tcp_socket > sock)
处理WebSocket升级请求
void remove_session(const session_ptr &session)
移除会话
function< void(session_ptr)> session_handler
会话处理器类型
void broadcast(const string &data, websocket_opcode opcode=websocket_opcode::TEXT)
向所有会话广播消息
shared_ptr< websocket_session > session_ptr
会话智能指针类型
ssl_socket * ssl_socket_ptr() noexcept
获取SSL socket指针
function< void(websocket_status, const string &)> close_handler
关闭处理器类型
void set_error_handler(error_handler handler)
设置错误处理器
void close(websocket_status status=websocket_status::NORMAL_CLOSURE, const string &reason="")
关闭连接
function< void(const string &, websocket_opcode)> message_handler
消息处理器类型
bool is_open() const noexcept
检查连接是否开启
bool send(const string &data, websocket_opcode opcode=websocket_opcode::TEXT)
发送文本/二进制消息
bool send_binary(const string &data)
发送二进制消息
websocket_session(unique_ptr< tcp_socket > sock, websocket_server *server=nullptr)
构造函数
const tcp_socket & socket() const noexcept
获取底层socket常量引用
function< void(const exception &)> error_handler
错误处理器类型
void set_message_handler(message_handler handler)
设置消息处理器
tcp_socket & socket() noexcept
获取底层socket引用
const ssl_socket * ssl_socket_ptr() const noexcept
获取SSL socket常量指针
void set_close_handler(close_handler handler)
设置关闭处理器
vector< byte_t > byte_vector
字节向量类型别名
unsigned char uint8_t
8位无符号整数类型
unsigned char byte_t
字节类型,定义为无符号字符
unsigned short uint16_t
16位无符号整数类型
http_server_request http_request
HTTP请求类型别名
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
websocket_opcode
WebSocket帧操作码
websocket_status
WebSocket关闭状态码
@ INVALID_FRAME_PAYLOAD_DATA
无效帧负载
@ UNSUPPORTED_DATA
不支持的数据类型
enable_shared_from_this() noexcept