使用POCO C ++的非阻塞WebSocket服务器

时间:2016-02-22 15:56:29

标签: c++ websocket poco-libraries

我正在尝试使用POCO构建WebSocket服务器。 我的服务器应该在一段时间内将数据发送到客户端。当客户端发送一些数据时,服务器应该操纵它发送给客户端的数据。

我的WebSocketRequestHandler中的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(),直到它获得一个帧 那么我怎样才能解决这个问题,public Notification Notify(Notification notification) { var messageXml = MessageFactory.Create(notification); var statusCode = SendWebRequestAsync(messageXml); notification.ProcessedAttempts++; if (statusCode.Result == HttpStatusCode.OK) { notification.Processed = true; notification.DateProcessed = DateTime.UtcNow; } return notification; } private async Task<HttpStatusCode> SendWebRequestAsync(string message) { using (var webClient = new WebClient()) { byte[] data = message.ToUtf8Bytes(); var uri = new Uri(url); try { webClient.UploadDataCompleted += WebClient_UploadDataCompleted; var result = await webClient.UploadDataTaskAsync(uri, "POST", data); string response = Encoding.UTF8.GetString(result); if (response == "") return HttpStatusCode.OK; return HttpStatusCode.NoContent; } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError) { var response = ex.Response as HttpWebResponse; if (response != null) { return response.StatusCode; } } // no http status code available return HttpStatusCode.ServiceUnavailable; // guess } catch (Exception) { return HttpStatusCode.InternalServerError; } } } private void WebClient_UploadDataCompleted(object sender, UploadDataCompletedEventArgs e) { Console.WriteLine(e.Result); } 并没有阻止循环 是解决这个完整问题的更好方法吗?

感谢。

2 个答案:

答案 0 :(得分: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); 

答案 1 :(得分:0)

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