首页 > 其他分享 >boost框架 创建websocket非阻塞服务

boost框架 创建websocket非阻塞服务

时间:2024-01-14 11:12:19浏览次数:35  
标签:std asio websocket 阻塞 tcp beast _. boost acceptor

#include <iostream>
#include <boost/asio.hpp>
#include <boost/beast.hpp>
#include <boost/beast/websocket.hpp>

namespace asio = boost::asio;
namespace beast = boost::beast;
namespace websocket = beast::websocket;
using tcp = asio::ip::tcp;

class WebSocketSession : public std::enable_shared_from_this<WebSocketSession> {
public:
	WebSocketSession(tcp::socket socket)
		: ws_(std::move(socket)) {}

	void start() {
		ws_.async_accept(beast::bind_front_handler(&WebSocketSession::on_accept, shared_from_this()));
	}

private:
	void on_accept(beast::error_code ec) {
		if (ec)
			return;

		ws_.async_read(buffer_, beast::bind_front_handler(&WebSocketSession::on_read, shared_from_this()));
	}

	void on_read(beast::error_code ec, std::size_t bytes_transferred) {
		if (ec == websocket::error::closed)
			return;

		if (ec)
			return;
		// 处理接收到的消息
		std::string vbuffer = beast::buffers_to_string(buffer_.data());
		std::cout << vbuffer << std::endl;
		buffer_.clear();
		// 继续等待下一条消息
		ws_.async_read(buffer_, beast::bind_front_handler(&WebSocketSession::on_read, shared_from_this()));
	}

	websocket::stream<beast::tcp_stream> ws_;
	beast::flat_buffer buffer_;
};

class WebSocketServer {
public:
	WebSocketServer(asio::io_context& ioc, tcp::endpoint endpoint)
		: ioc_(ioc), acceptor_(ioc) {

		// 创建并打开 acceptor
		acceptor_.open(endpoint.protocol());
		acceptor_.set_option(asio::socket_base::reuse_address(true));
		acceptor_.bind(endpoint);
		acceptor_.listen(asio::socket_base::max_listen_connections);

		do_accept();
	}

private:
	void do_accept() {
		acceptor_.async_accept(
			[this](beast::error_code ec, tcp::socket socket) {
				if (!ec) {
					// 使用 SSL 上下文创建 WebSocket 会话
					std::make_shared<WebSocketSession>(std::move(socket))->start();
				}

				// 继续等待新的连接
				do_accept();
			});
	}

	asio::io_context& ioc_;
	tcp::acceptor acceptor_;
};

int main() {
	try {
		asio::io_context ioc;
		tcp::endpoint endpoint(tcp::v4(), 9002);
		WebSocketServer server(ioc, endpoint);
		ioc.run();
	}
	catch (const std::exception& e) {
		std::cerr << "Error: " << e.what() << std::endl;
		return EXIT_FAILURE;
	}

	return EXIT_SUCCESS;
}

标签:std,asio,websocket,阻塞,tcp,beast,_.,boost,acceptor
From: https://www.cnblogs.com/kuangke/p/17963455

相关文章

  • WebSocket-FLV H264/H265服务器基本实现
    场景HTTP-FLV:基于HTTP流式IO传输FLV,依赖浏览器支持播放FLV。但是由于同源的限制问题,浏览器只能播放六路视频,因此采用WebSocket-FLVWebSocket-FLV:基于WebSocket传输FLV,依赖浏览器支持播放FLV。WebSocket建立在HTTP之上,建立WebSocket连接前还要先建立HTTP连接。视频参数代码H264S......
  • Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息
    场景Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中:Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中-Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作:Winform中操作Sqlite数据增删改查、程序启动时执......
  • Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中
    场景SpringBoot+Vue整合WebSocket实现前后端消息推送:SpringBoot+Vue整合WebSocket实现前后端消息推送_websocketvue3.0springboot往客户端推送上面实现ws推送数据流程后,需要在windows上使用ws客户端定时记录收到的数据到文件中,这里文件使用SQLite数据库进行存储。Winform中操作S......
  • http和websocket的一些思考
    InCivetWeb,thetermsCivetHandlerandCivetWebSocketHandlerarerelatedtodifferenttypesofrequesthandling.CivetHandler:CivetHandlerisagenericclassinCivetWebthatisusedforhandlingHTTPrequests.Whenyoucreateaclassthatinheritsfr......
  • WebSocket与JavaScript:实现实时地理位置定位系统的关键技术
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • 如何使用WebSocket和JavaScript实现在线人脸识别系统
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • SpringBoot WebSocket 样例
    SpringBootWebSocket样例pom.xml依赖配置<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>javax.webso......
  • 用 Socket.D 替代原生 WebSocket 做前端开发
    socket.d.js是基于websocket包装的socket.d协议的实现。就是用ws传输数据,但功能更强大。功能原生websocketsocket.d说明listen有有监听消息send有有发消息sendAndRequest无有发消息并接收一个响应(类似于http)sendAndSubscribe无有发消息......
  • SpringBoot集成WebSocket实现消息推送
    一、前言WebSocket是一种新型的通信协议,它可以在客户端和服务端之间实现双向通信,具有低延迟、高效性等特点,适用于实时通信场景。它是一种基于TCP协议实现的全双工通信协议,使用它可以实现实时通信,不必担心HTTP协议的短连接问题。SpringBoot可以很方便的集成WebSocket实现高效实时的......
  • Chromium 是如何解决队头阻塞问题的
    为了解决由于单消息队列而造成的队头阻塞问题,Chromium团队从2013年到现在,花了大量的精力在持续重构底层消息机制。1、第一次迭代:引入一个高优先级队列首先在最理想的情况下,我们希望能够快速跟踪高优先级任务,比如在交互阶段,下面几种任务都应该视为高优先级的任务:通过鼠标触发的点......