【发布时间】: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