【问题标题】:POCO WebSocket - sending data from another classPOCO WebSocket - 从另一个类发送数据
【发布时间】:2016-03-04 12:31:51
【问题描述】:

我正在尝试创建一个 WebSocket 服务器。

我可以建立连接,到目前为止一切正常。

this GitHub 示例中,数据在客户端连接时调用的handleRequest() 方法中发送。

但是我可以使用已建立的 WebSocket 连接从另一个类向客户端发送数据吗?

我怎样才能归档这个?这甚至可能吗?

谢谢。

【问题讨论】:

  • 你需要比“它不起作用”更具体。

标签: c++ websocket poco-libraries


【解决方案1】:

当然,这是可能的。在您提到的示例中,您应该在RequestHandlerFactory 中有一个指向WebSocket 的成员指针,例如:

class RequestHandlerFactory: public HTTPRequestHandlerFactory
{
//...
private:
  shared_ptr<WebSocket> _pwebSocket;
};

将其传递给WebSocketRequestHandler constructor:

return new WebSocketRequestHandler(_pwebSocket);

WebSocketRequestHandler 应该是这样的:

class WebSocketRequestHandler: public HTTPRequestHandler
{
public:
  WebSocketRequestHandler(shared_ptr<WebSocket> pWebSocket) :_pWebSocket(pWebSocket)
  {}
  void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
  {
    // ...
    _pWebSocket.reset(make_shared<WebSocket>(request, response));
    // ...
  }
private:
  shared_ptr<WebSocket> _pWebSocket;
}

现在,在请求处理程序创建它之后,您将拥有一个指向工厂中的 WebSocket 的指针(它是长期存在的,与 RequestHandler 不同,每个请求都会出现和消失)。请记住,处理程序在其自己的线程中执行,因此您应该有某种锁定或通知机制来发出处理程序实际创建 WebSocket 的信号(成功创建 WebSocket 后,_pWebSocket 的布尔转换为真) .

上面的例子只说明了单个 WebSocket 的情况——如果你想有多个,你应该有一个指针数组或向量,并根据需要添加/删除它们。在任何情况下,WebSocket 指针不一定要驻留在工厂中 - 您可以(a)将它们放在应用程序中的其他位置并将它们传播到工厂/处理程序或(b)拥有全局设施(具有适当的 multi -thread-access 机制)持有 WebSocket(s)。

【讨论】:

  • 这正是我所需要的。谢谢!
  • proper multi-thread-access mechanism for (b) 看起来像什么?只是锁定sendFrame()
  • 取决于您的应用程序,我不知道足以提供有效的建议。
  • 如果我有多个客户端通过 WebSocket 连接,并且成员存储在一个处理程序中。那么如果我在向客户端发送数据之前锁定mutex就足够了吗?
  • 第一件事是,您不想在套接字创建并准备好使用之前开始使用它(这将发生在处理程序线程中)。如果您通过一个套接字从多个线程发送帧,是的 - 您应该确保一次发送一个线程(虽然有点不寻常的设计)。我不明白“存储在一个处理程序中”部分 - 正如所解释的那样,如果您只是将 WebSocket 存储在处理程序中,ti 不会存在很长时间,并且无法从其他地方访问它(这是询问的最初原因问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多