Stream模块
流结构,提供字节流读写接口
github
https://github.com/huxiaohei/tiger.git
实现
在tiger
中所有的流结构都应该继承自抽象类Stream
,Stream
类规定了一个流必须具备read
、write
、readFixSize
、writeFixSize
接口
类图
SocketStream
分析
在SocketStream
构造函数中传入Socket
对象保存在属性m_socket
中,然后我们在调用SocketStream
对象的read
、write
等接口的时候,实际是调用的Socket
对象的recv
和send
接口
int SocketStream::read(void *buffer, size_t len) {
if (!is_connected()) return -1;
return m_socket->recv(buffer, len);
}
int SocketStream::read(ByteArray::ptr ba, size_t len) {
if (!is_connected()) return -1;
std::vector<iovec> iovs;
ba->get_enable_write_buffers(iovs, len);
int rt = m_socket->recv(&iovs[0], iovs.size());
if (rt > 0) {
ba->set_position(ba->get_position() + rt);
}
return rt;
}
int SocketStream::write(const void *buffer, size_t len) {
if (!is_connected()) return -1;
return m_socket->send(buffer, len);
}
int SocketStream::write(ByteArray::ptr ba, size_t len) {
if (!is_connected()) return -1;
std::vector<iovec> iovs;
ba->get_enable_read_buffers(iovs, len);
int rt = m_socket->send(&iovs[0], iovs.size());
if (rt > 0) {
ba->set_position(ba->get_position() + rt);
}
return rt;
}
这种封装,可以让业务开发人员不必关心数据是如何存储和读取,以及数据如何通过socket
发送到网络,从而进一步降低网络编程的成本