分析一下TCPHandler.cpp中的in和out两个(私有的)成员变量,
/// Streams for reading/writing from/to client connection socket.
std::shared_ptr<ReadBuffer> in;//从客户端读取的数据
std::shared_ptr<WriteBuffer> out;//要写到客户端的数据
在runImpl()方法中,从这里开始:
//从客户端读取的数据
in = std::make_shared<ReadBufferFromPocoSocket>(socket());
//要写到客户端的数据
out = std::make_shared<WriteBufferFromPocoSocket>(socket());
可以看到in和out分别是ReadBuffer和WriteBuffer,即构造的是读缓冲区和写缓冲区,数据读的来源和写的去处都是PocoSocket。
先分析下socket()方法,他返回的是一个StreamSocket对象。可以不用深究这个具体是什么,这个是POCO::Net库中封装好的。
分析in,看下ReadBufferFromPocoSocket的构造方法:
ReadBufferFromPocoSocket(Poco::Net::Socket &socket_, size_t buf_size = DBMS_DEFAULT_BUFFER_SIZE);
ReadBufferFromPocoSocket::ReadBufferFromPocoSocket(Poco::Net::Socket &socket_, size_t buf_size)
: BufferWithOwnMemory<ReadBuffer>(buf_size), socket(socket_), peer_address(socket.peerAddress())
{
}
其中,
/// The size of the I/O buffer by default.
#define DBMS_DEFAULT_BUFFER_SIZE 1048576ULL //1024 * 1024 = 1MB, I/O buffer默认是1MB
通过源码可以看到,ReadBufferFromPocoSocket继承了BufferWithOwnMemory<ReadBuffer>,包含两个protected类型的成员变量:socket和peer_address。
在ReadBufferFromPocoSocket的构造方法中,就分别对这几个变量进行了初始化,同时调用alloc()方法分配了默认1MB的内存用作ReadBuffer。
同理WriteBuffer也是这样的。
注意:ReadBuffer和WriteBuffer分配的内存是BufferWithOwnMemory,即有自己的working memory。
(ReadBuffer和WriteBuffer都继承自BufferBase,BufferBase有成员变量working_buffer和internal_buffer)
(这里理解的还不是很透彻,先mark下)
后面Client端和Server端的数据交换会经常用到in和out的,大概流程如下图,可后面以再留意理解一下。