websocket 服务器

websocket在开发上有两条路径。第一条是自行处理消息,第二条是由服务器自动处理。前者需要开发者使用c/c++语言,后者则只需开发者使用javascript语言。

来看代码:

  1. #include <mongols/ws_server.hpp>
  2. int main(int,char**){
  3. int port=9090;
  4. const char* host="127.0.0.1";
  5. mongols::ws_server server(host,port,5000,8096,4);
  6. auto f=[](const std::string& input
  7. , bool& keepalive
  8. , bool& send_to_other
  9. , mongols::tcp_server::client_t& client
  10. , mongols::tcp_server::filter_handler_function& send_to_other_filter){
  11. keepalive = KEEPALIVE_CONNECTION;
  12. send_to_other=true;
  13. if(input=="close"){
  14. keepalive = CLOSE_CONNECTION;
  15. send_to_other = false;
  16. }
  17. return input;
  18. };
  19. server.run(f);
  20. //server.run();
  21. }

以上代码中的f是一个handler,它是实现开发者自行处理消息的关键。以上实现是说,如果客户端发送close消息到服务器,服务器就关闭它的连接,并且不转发该消息;除此而外,服务器会保持连接,并转发消息到所有在线客户端。这是走第一条路径的一个例子,它没有实现聊天群组功能和其他特性。

走第二条路径就简单多了。没有参数的 run可调用内置的群组管理机制,开发者仅仅在前端使用javascript即可完成对群组的控制和管理。是不是太方便!

怎么用?每一次用javascript服务器发送的消息应该是一个用JSON.stringify处理的json数据。该数据应该包含以下是个字段:

  • uid,表示连接id,默认是0。
  • gid, 表示连接所属群组id或群组id数组,默认是0。如果需退出某群组,用负的gid表示即可。
  • gfilter,表示可接受该消息的群组gid数组。如果为空数组,则表示转发至所有在线群组。
  • ufilter,表示可接受该消息的的uid数组。如果为空数组,则表示转发至所有在线连接。
    其他字段为自选。服务器收到数据后,会解析该数据,根据以上四个字段作相应处理,并返回该数据。

具体实现,可参考demo

原文: https://mongols.hi-nginx.com/doc/websocket.html