websocket++ - 在 run() 但在处理程序之外会发生什么?/ send() 应该放在哪里?
问题描述
我想随时send
发消息。但是,我不知道该放在哪里send()
。我实际上不知道run()
调用之后会发生什么,但不知道在处理程序内部会发生什么。
我目前的设置只是为了send
我的信息,on_open
因为这是我可以send
让它工作的唯一地方。但是,以这种方式发送多条消息被证明是一个问题。我可以从 关闭连接on_message
,但我无法send
通过该客户端再次关闭,无论我是否再次connect
关闭run()
。
理想的解决方案是不必close
重新打开连接或端点。再一次,我想知道我应该放在哪里,send
如果不在on_open
或on_message
c.init_asio();
c.start_perpetual();//I've tried both perpetual and non-perpetual
//[associate handlers]
c.connect(con); //connecting and running works fine;
c.run(); //on_open, on_message work fine
sleep(15); //is 15 seconds enough for the asio to clean up everything?
c.connect(con); //any permutation of these two lines
c.run(); //do nothing after close() has been called
std::string test("test");
con->send(test,websocketpp::frame::opcode::TEXT); //this does nothing
使用 C++11 和 VS2015。另外我无法复制/粘贴代码,所以我可能错过了一些愚蠢的错别字。不知道还能说什么。我不知道我可以把它放在哪里send
,以便我可以在按下按钮时发送它,例如
解决方案
当将 WebSocket++ 与基于 Asio 的传输一起使用时,该endpoint::run
方法只是 Asio 的io_service.run()
. 如果您需要很多详细信息,Asio 有大量关于其工作原理的文档。
简而言之,run
将在执行基于事件的网络 I/O 循环时无限期阻塞,并且在连接完成之前不会返回。
通过响应各种处理程序,可以在该事件循环中发送消息。正如您所注意到的,您可以从打开的处理程序发送消息。另一个发送消息的常用处理程序是消息处理程序,它允许您回复远程端点发送的任何消息。如果您想独立于网络事件(打开、收到消息等)发送消息,您可以使用中断处理程序(尽快触发新事件)或定时器处理程序(一段时间后触发新事件)或设置在您需要时发送消息的线程。
捆绑telemetry_server
示例演示了计时器方法,telemetry_client
示例演示了线程方法。
推荐阅读
- dart - Dart 语言中的原始数据类型
- php - 如何运行 do-while 循环,该循环使用 PHP 检查 JSON 中的值?
- grails - 如何在不初始化 Grails 环境的情况下运行 Spock 单元测试
- c# - C# Winforms Forms DataGridView/ToolStrp 的可视化继承问题
- sql - 通过sql server中的游标从表中删除多条记录
- ios - 在 ReplayKit 停止当前广播之前添加延迟:-finishBroadcast(handler:)
- database - 实体框架 6.4.4 迁移问题(“参数@objname 不明确或声明的@objtype (COLUMN) 错误。”)
- visual-studio-code - vs 代码扩展中对等方的用户信息(用户名、电子邮件。id)为空
- mongodb - 如何将 mongodb 的 Hash Id 替换为简单的 Int?
- django - 在 django 中登录没有 login() 功能的用户