提升 asio 服务器
Boost asio server
关于以下问题的答案:带有Boost:Asio的游戏服务器如何异步工作?
如果我有一个执行计算并同时从客户端发送/接收数据包的服务器怎么办?
我的意思是,如果我正在编写一个http服务器,答案上的示例就足够了,因为发送的所有数据都是接收到的数据的功能。
假设我的程序计算值并需要根据客户的需求更新客户端(有些人可能想要更新频率 1 Hz,而另一个需要更新频率 10 Hz 等)。
这种结构对我非常有帮助:
while(1){
pollNetworking(); //<- my function
value1 += 5; value2 = random();
}
在我的pollNetworking 函数中,我正在考虑调用类似acceptor.accept(*socket,10)的东西;其中10是以毫秒为单位的超时,但由于没有超时参数,我不知道如何构建它。
可扩展性不是最大的问题,我可以为每个套接字生成一个线程,一个额外的线程用于接受,另一个线程用于计算吗?这容易实现吗?因为我希望它尽可能稳定,然后是速度,然后是可扩展性。当涉及到多线程时,我不相信自己可以干净地编码和调试它。
编辑:我了解到我可以使用io_service::p oll,它只调度就绪事件而不阻止。所以它是一个超时为 0 的同步函数,完全符合我的需要。
服务器可以在从客户端发送和接收数据的同时进行计算。 但是,可能需要保护缓冲区和套接字免受并发访问。
对于大多数 Boost.Asio 操作,可移植超时功能仅在异步操作上可用。 这需要在实体上发出异步操作,设置计时器,然后等待。 有关取消超时async_read
的示例,请参阅此问题。
最简单且可扩展性较低的方法是为每个职责指定一个线程(每个套接字的线程、接受和计算)。 可能需要进行同步,例如保护计算结果。 例如,如果 value1
和 value2
仅在同一个迭代中有意义,则套接字线程需要保证这些值一起写入,而不会让计算线程在写入过程中更改值。 可以使用各种同步构造(例如 Boost.Thread 提供的同步构造)来实现此目的。 此外,通过最小化使用的异步调用量,可能更容易实现和调试。
对于可伸缩性更强的方法,大多数程序将编写为从异步操作调用的一系列处理程序。 这允许程序更容易地利用线程和线程池。 但是,它可以将程序逻辑分散在众多功能中,并且很快就会变得难以遵循。 通常,在编写时考虑异步操作的程序将与boost::asio::strand
执行同步,并通过boost::shared_ptr
管理对象生存期。
实施的难易程度将取决于经验。 请记住,网络编程、并发和异步操作本质上是困难的。 很少有既简单又完整的解决方案。
您仍然可以使用异步接受和接收,但在需要时同步发送到客户端。
如果可以为每个连接的客户端使用单独的线程(我猜您不会期望有数百或数千个连接),那么您可以为每个连接的客户端使用一个线程进行计算和发送,同时保持接收异步。
- 提升 Asio TCP 服务器 处理多个客户端
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 提升::Asio 异步聊天客户端停止与服务器通信
- 如何使用 asio 本地数据报构建回显服务器和客户端?
- 为什么io_context在我的boost asio协同程序服务器中丢失
- ASIO - 如何停止基于简单协程的服务器?
- 提升 ASIO TCP 服务器架构
- 提升 ASIO 服务器 - 检测空闲连接
- 提升 asio 回声服务器示例中的黑客或错误?
- 服务器和客户端同时使用BOOST-ASIO
- 使用线程池提升 ASIO 多线程 TCP 服务器
- 尝试重新连接到服务器时获取错误提升 asio 连接超时
- 浏览器将随机HTTP消息正文发送到我的boost.asio服务器.我可以更改此设置吗?
- boost::asio http 服务器无法向 Postman 返回有效响应
- boost::asio::ip::tcp::iostream,先启动客户端,然后等待服务器
- 是否可以添加多个服务器地址?(Asio,客户端>服务器)
- 使用Valgrind时,偶尔的BOOST :: ASIO TCP服务器故障在Localhost上运行
- 使用Boost ASIO查找服务器IP
- Boost.Asio 异步服务器.限制为一个连接
- 在 Boost ASIO 服务器中处理生命周期