Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ POCO WebSocket-从另一个类发送数据_C++_Websocket_Poco Libraries - Fatal编程技术网

C++ POCO WebSocket-从另一个类发送数据

C++ POCO WebSocket-从另一个类发送数据,c++,websocket,poco-libraries,C++,Websocket,Poco Libraries,我正在尝试创建WebSocket服务器 我可以建立一个连接,到目前为止一切正常 在GitHub示例中,数据在客户端连接时调用的handleRequest()方法中发送 但是我可以使用已建立的WebSocket连接从另一个类向客户端发送数据吗 我怎样才能归档这个?这可能吗 谢谢。当然,这是可能的。在您提到的示例中,您应该在RequestHandlerFactory中有一个指向WebSocket的成员指针,例如: class RequestHandlerFactory: public HTTPReq

我正在尝试创建WebSocket服务器

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

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

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

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


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

class RequestHandlerFactory: public HTTPRequestHandlerFactory
{
//...
private:
  shared_ptr<WebSocket> _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;
}
类WebSocketRequestHandler:公共HTTPRequestHandler
{
公众:
WebSocketRequestHandler(共享的\u ptr pWebSocket):\u pWebSocket(pWebSocket)
{}
void handleRequest(HTTPServerRequest&request,HTTPServerResponse&response)
{
// ...
_pWebSocket.reset(使_共享(请求、响应));
// ...
}
私人:
共享_ptr_pWebSocket;
}
现在,在请求处理程序创建它之后,您将有一个指向工厂中WebSocket的指针(它是长期存在的,不像
RequestHandler
,它随每个请求而来又去)。请记住,处理程序在其自己的线程中执行,因此您应该具有某种锁定或通知机制,以在处理程序实际创建WebSocket时发出信号(成功创建WebSocket后,
\u pWebSocket
的bool cast将为true)


上面的示例仅说明了单个WebSocket的情况-如果您想要有多个WebSocket,则应该有一个指针数组或向量,并根据需要添加/删除它们。在任何情况下,WebSocket指针都不必驻留在工厂中—您可以(a)将它们放在应用程序的其他位置,并将它们传播到工厂/处理程序,或者(b)拥有一个全局工具(具有适当的多线程访问机制)来保存WebSocket

你需要比“它不起作用”更具体一些。这正是我需要的。非常感谢。(b)的
适当的多线程访问机制是什么样子的?仅锁定
sendFrame()
?取决于您的应用程序,我不知道如何提供有效的建议。如果我有几个客户端通过WebSocket连接,并且成员存储在一个处理程序中。那么,如果我在向客户端发送数据之前锁定
互斥锁
就足够了吗?首先,您不希望在创建套接字并准备好使用它之前就开始使用它(这将在处理程序线程中发生)。如果您是通过一个套接字从多个线程发送帧,是的-您应该确保一次发送一个线程(尽管设计有些不寻常)。我不理解“存储在一个处理程序中”这一部分——如前所述,如果您只在处理程序中存储WebSocket,则ti不会存活很长时间,并且无法从其他地方访问它(这是提出此问题的最初原因)。
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;
}