Boost服务器端的acceptor、io_context和socket的理解
完整的场景(使用餐厅接待顾客和电话机的比喻):
-
服务器(餐厅)和
acceptor
(前台服务员):- 服务器就是餐厅,
acceptor
是餐厅的前台服务员(接待员)。 - 这个
acceptor
服务员会 一直在门口等着顾客(客户端)进来。当有顾客走进来时(客户端发起连接请求),acceptor
就会负责接待这个顾客。
- 服务器就是餐厅,
-
io_context
(调度员/任务分配员):- 当有顾客进来后,服务员并不会自己去直接服务顾客,而是把顾客交给 调度员(
io_context
)。 - 调度员就像任务分配员,负责安排不同的员工(如服务员)去处理具体的顾客服务工作。
- 这里,
io_context
管理和协调所有异步任务(如接受连接、读写数据等)。
- 当有顾客进来后,服务员并不会自己去直接服务顾客,而是把顾客交给 调度员(
-
socket
(电话机):- 一旦调度员(
io_context
)安排服务员(一个socket
)去服务顾客,这个socket
就像是一台电话机,专门用于和这个特定的顾客进行通信。 - 在网络通讯的比喻中,这个电话机(
socket
)就是服务器和客户端之间的数据传输工具。通过socket
,服务器可以发送数据给客户端,也可以接收客户端发来的数据。
- 一旦调度员(
步骤详解:
- 监听连接(等待顾客):
- 餐厅服务员(
acceptor
)一直站在门口,等待顾客(客户端)来光顾。acceptor
使用一个io_context
来管理它的监听工作。
- 餐厅服务员(
- 顾客到来(连接请求):
- 当有顾客进来时,服务员(
acceptor
)马上通知餐厅后面调度员(io_context
),表示有新的顾客到来了,得安排一个员工(socket
)去服务这个顾客。
- 当有顾客进来时,服务员(
- 安排服务员(分配 socket):
- 调度员(
io_context
)安排一个具体的服务员(创建一个新的socket
对象)去为这个顾客服务。 acceptor
会 接待顾客后,分配一个电话机(socket
)给服务员,这样顾客可以通过这个电话机和服务员交流(传输数据)。
- 调度员(
- 建立通讯(socket 连接):
- 服务员拿着电话机(
socket
)开始和顾客交流。电话机就是数据通信的管道,服务员通过这个电话可以和顾客聊订单(传输数据),提供服务(发送/接收数据)。
- 服务员拿着电话机(
- 处理顾客请求(通讯过程):
- 一旦电话连接建立,服务员可以不断通过电话和顾客进行交流(读写数据),直到服务结束(连接断开)。
// 1. 创建 io_context 对象
boost::asio::io_context io_context;// 2. 创建一个 acceptor,负责监听连接
boost::asio::ip::tcp::acceptor acceptor(io_context, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 8080));// 3. 当 acceptor 监听到连接时,创建一个 socket(电话机)
boost::asio::ip::tcp::socket socket(io_context);// 4. 接受连接,并通过这个 socket 与客户端通信
acceptor.accept(socket);// 5. 现在可以通过 socket 发送/接收数据