我正在尝试使用POCO库设计Websocket Server。我已经实现了一个简单的类WebSocketRequestHandler:public HTTPRequestHandler,它接受连接并执行任务等。 代码段如下:
class WebSocketRequestHandler: public HTTPRequestHandler
// Handle a WebSocket connection.
{
public:
WebSocketRequestHandler()
{
}
void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
{
Application& app = Application::instance();
try
{
std::cout << "Waiting for connection.." << std::endl;
WebSocket ws(request, response);
ws.setReceiveTimeout(Poco::Timespan(10, 0, 0, 0, 0));
app.logger().information("WebSocket connection established!");
int flags;
int n;
do
{
std::cout << "Waiting for incoming frame" << std::endl;
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
std::cout << "Frame received" << std::endl;
//Parse the frame sequentially and so on..
}
}
我不希望对服务器进行顺序操作。它应该是异步的。我尝试在POCO资源中查找,但是找不到与之相关的任何内容。那么POCO是否提供异步api?就像将传入的消息推送到队列中并让一个单独的线程分别处理消息,而主线程继续从客户端接收消息一样? 还是像boost asio api之类的东西,通过async_handle(socket,func *)注册功能并在单独的线程中处理每条消息? 还是其他更好的解决方案?
答案 0 :(得分:0)
有SocketReactor用于TCP,但没有异步HTTPServer,每个HTTP请求都在其自己的线程中处理,该线程是从ThreadPool获得的。虽然这对于较低的请求频率可以正常工作,但不会扩展。要对其进行扩展,可以使用NotificationQueue进行异步通知,或使用PollSet对套接字的可读/可写状态做出反应-只需确保队列或轮询集是长期存在的即可;处理程序是为每个请求而短暂创建的,因此您应该在HTTP请求工厂中创建处理工具。
请注意,PollSet有一个windows bug,在下一个版本中为fixed。
编辑:严格来说,进一步澄清一下,HTTPServer不是顺序的,因为每个处理程序都使用一个(预先创建的)线程。最好在处理功能上做尽可能少的工作,并“分流”其他地方的大部分工作量。