【问题标题】:Non blocking WebSocket Server with POCO C++使用 POCO C++ 的非阻塞 WebSocket 服务器
【发布时间】:2016-02-22 15:56:28
【问题描述】:

我正在尝试使用 POCO 构建 WebSocket 服务器。 我的服务器应该在一个时间间隔内一直向客户端发送数据。并且当客户端发送一些数据时,服务器应该操作它发送给客户端的数据。

WebSocketRequestHandler 中的handleRequest 方法:

void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
{
    WebSocket ws(request, response);
    char buffer[1024];
    int flags = 0;
    int n = 0;

    do {
        // recieving message
        n = ws.receiveFrame(buffer, sizeof(buffer), flags);
                   // ... do stuff with the message

        // sending message
        char* msg = (char *) "Message from server"; // actually manipulated, when message recieved
        n = sizeof(msg);
        ws.sendFrame(msg, strlen(msg), WebSocket::FRAME_TEXT);

        sleep(1);  // time intervall sending messages
    } while (n > 0 || (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
}

问题是,该方法卡在we.recieveFrame() 中,直到它获得一个帧。
那么我该如何解决这个问题,receiveFrame() 没有阻塞循环。
是解决这个完整问题的更好方法吗?

谢谢。

【问题讨论】:

  • '非阻塞'......sleep(1);
  • 当然..你是对的 :-) @MartinJames,但实际上,当客户不发送消息时,它甚至还没有走这么远。
  • 不确定您要做什么。如果你没有得到一个框架,你就没有消息,那么你会发送什么?
  • 当客户端连接时,一个base64编码的String被发送到客户端,在浏览器中呈现为图像。这就是原因,服务器必须不断地向客户端发送。如果客户端向服务器发送消息,例如“blackWhite”,则服务器正在执行一些处理并更改字符串,即发送到浏览器。等等……
  • 我在基于 Poco C++ 库的解决方案上管理了类似的情况,方法是设置接收超时:ws.setReceiveTimeout(timeout);

标签: c++ websocket poco-libraries


【解决方案1】:

您应该设置接收超时。

ws.setReceiveTimeout(timeout);

因此,您将在每个超时微秒内获得一个Poco::TimeoutException,您可以做所有您需要的事情,包括通过该 websocket 发送数据。

ws.setReceiveTimeout(1000000);//a second
do{
  try{
    int n = ws.receiveFrame(buffer, sizeof(buffer), flags);
    //your code to manipulate the buffer
  }
  catch(Poco::TimeoutException&){
    ....
  }
  //your code to execute each second and/or after receive a frame
} while (condition); 

【讨论】:

    【解决方案2】:

    使用std::threadpthread 并在线程函数中调用阻塞函数

    【讨论】: