acl  3.5.3.0
WebSocketServlet.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "HttpServlet.hpp"
4 
5 #ifndef ACL_CLIENT_ONLY
6 
7 namespace acl
8 {
9 
10 class websocket;
11 class session;
12 class HttpServletRequest;
13 class HttpServletResponse;
14 
16 {
17 public:
18  WebSocketServlet(void);
19 
20  /**
21  * 构造函数
22  * @param stream {socket_stream*} 当在 acl_master 服务器框架控制下
23  * 运行时,该参数必须非空;当在 apache 下以 CGI 方式运行时,该参数
24  * 设为 NULL;另外,该函数内部不会关闭流连接,应用应自行处理流对象
25  * 的关闭情况,这样可以方便与 acl_master 架构结合
26  * @param session {session*} 每一个 HttpServlet 对象一个 session 对象
27  */
29 
30  /**
31  * 构造函数
32  * @param stream {socket_stream*} 当在 acl_master 服务器框架控制下
33  * 运行时,该参数必须非空;当在 apache 下以 CGI 方式运行时,该参数
34  * 设为 NULL;另外,该函数内部不会关闭流连接,应用应自行处理流对象
35  * 的关闭情况,这样可以方便与 acl_master 架构结合
36  * @param memcache_addr {const char*}
37  */
39  const char* memcache_addr = "127.0.0.1:11211");
40 
41  /**
42  * HttpServlet 对象开始运行,接收 HTTP 请求,并回调以下 doXXX 虚函数,
43  * 该函数首先会调用 start 过程,然后根据 start 的返回结果及请求/响应
44  * 对象是否要求保持长连接来决定是否需要与客户端保持长连接.
45  */
46 
47  virtual ~WebSocketServlet(void);
48 
49  // @override
50  bool doRun(void);
51 
52  // @override
53  bool doRun(session& session, socket_stream* stream = NULL);
54 
55  // @override
56  bool doRun(const char* memcached_addr, socket_stream* stream);
57 
58  /**
59  * 发送二进制数据.
60  * @param buf {const char *} 发送的数据
61  * @param len {int} buf 数据长度
62  * @return {bool} 错误 false, 否则 true
63  */
64  bool sendBinary(const char *buf, int len);
65 
66  /**
67  * 发送文本数据.
68  * @param text {const char *} 发送的数据
69  * @return {bool} 错误 false, 否则 true
70  */
71  bool sendText(const char *text);
72 
73  /**
74  * 发送pong 消息.
75  * @param buffer {const char *} 发送的数据
76  * @return {bool} 错误 false, 否则 true
77  */
78  bool sendPong(const char *buffer = NULL);
79 
80  /**
81  * 发送pong 消息.
82  * @param buffer {const char *} 发送的数据
83  * @return {bool} 错误 false, 否则 true
84  */
85  bool sendPing(const char *buffer = NULL);
86 
87 protected:
88  /**
89  * websocket 关闭消息回调
90  */
91  virtual void onClose(void) {}
92 
93  /**
94  * websocket ping 消息回调.
95  * @param payload_len {unsigned long long} 消息数据总长度
96  * @param finish {bool} 本数据包是否最后一个
97  * @return {bool} false 断开连接。
98  */
99  virtual bool onPing(unsigned long long payload_len, bool finish) = 0;
100 
101  /**
102  * websocket pong 消息回调.
103  * @param payload_len {unsigned long long} 消息数据总长度
104  * @param finish {bool} 本数据包是否最后一个
105  * @return {bool} false 断开连接。
106  */
107  virtual bool onPong(unsigned long long payload_len, bool finish) = 0;
108 
109  /**
110  * websocket ping 消息回调.
111  * @param payload_len {unsigned long long} 消息数据总长度
112  * @param text {bool } true 表示为文本数据, 否则是 二进制数据。
113  * @param finish {bool} 本数据包是否最后一个
114  * @return {bool} false 断开连接。
115  */
116  virtual bool onMessage(unsigned long long payload_len,
117  bool text, bool finish) = 0;
118 
119  /**
120  * 子类可以循环调用此方法获得数据帧的数据体,直至返回 <= 0 为止
121  * @param buf {size_t*} 数据缓冲区用来存放结果数据
122  * @param size {size_t} buf 缓冲区大小
123  * @return {int} 读到的数据长度,分以下三种情形:
124  * 0: 表示数据帧正常读完
125  * -1: 表示读出错
126  * >0: 表示读到的数据,应再次调用本方法以便读余下的数据
127  */
128  int readPayload(void* buf, size_t size);
129 
130  /**
131  * 返回 websocket 对象,如果返回 NULL 表示还未建立 websocket 连接
132  * @return {websocket*}
133  */
135  {
136  return ws_;
137  }
138 
139 private:
140  // @override
141  bool doWebSocket(HttpServletRequest&, HttpServletResponse&);
142 
143 private:
144  websocket *ws_;
145  int opcode_;
146 };
147 
148 } // namespace acl
149 
150 #endif // ACL_CLIENT_ONLY
websocket * get_websocket(void) const
virtual void onClose(void)
#define ACL_CPP_API