POCO Websocket中用于传入消息的Aysnc处理程序

时间:2018-07-09 10:26:50

标签: c++ websocket poco poco-libraries

我正在尝试使用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 *)注册功能并在单独的线程中处理每条消息? 还是其他更好的解决方案?

1 个答案:

答案 0 :(得分:0)

SocketReactor用于TCP,但没有异步HTTPServer,每个HTTP请求都在其自己的线程中处理,该线程是从ThreadPool获得的。虽然这对于较低的请求频率可以正常工作,但不会扩展。要对其进行扩展,可以使用NotificationQueue进行异步通知,或使用PollSet对套接字的可读/可写状态做出反应-只需确保队列或轮询集是长期存在的即可;处理程序是为每个请求而短暂创建的,因此您应该在HTTP请求工厂中创建处理工具。

请注意,PollSet有一个windows bug,在下一个版本中为fixed

编辑:严格来说,进一步澄清一下,HTTPServer不是顺序的,因为每个处理程序都使用一个(预先创建的)线程。最好在处理功能上做尽可能少的工作,并“分流”其他地方的大部分工作量。