我正在尝试使用 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()
不会阻塞循环。
是否有更好的方法来解决这个完整的问题?
谢谢。
最佳答案
您应该设置接收超时。
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);
关于c++ - 使用 POCO C++ 的非阻塞 WebSocket 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35558089/