流在Peercast中是一个很重要的概念。
凡是数据从一个地方传输到另一个地方的操作都是流的操作,所以就网络交换数据而言,例如包的发送和接收,都可视为流操作。
Peercast中用Stream类来提供一个界面。
其继承类有FileStream和ClientSocket。
Stream类提供读取和写入各种不同类型数据(ID4类型、字符型、整型、字符串)的操作,例如
long readLong()
{
long v;
read(&v,4);
CHECK_ENDIAN4(v);
return v;
}
void Stream::writeLine(const char *str)
{
writeString(str);
if (writeCRLF)
write("/r/n",2);
else
write("/n",1);
}
其他还有readInt()、readChar()、writeString()等
而这些操作都访问的是read()和write()函数
这里我们看看read()函数的定义
virtual int read(void *,int)=0;
是个虚函数,而且这个虚函数在基类中并没有实现,而是留在子类中实现的
在FileStream中read()是从文件中读取相应字节的数据,在ClientSocket中read()是在网络中接收相应字节的数据。
在基类中使用一个未来才实现的方法是不是觉得有些不可思议?
这里基类依赖于它的派生类实现。我们通常都知道派生类依赖于基类实现,其实反过来也是可以成立的。
这样做的好处在于提供一个框架,使以后的程序员可以加入代码。
有关这方面的讨论可以参见《C++程序设计语言》设计和编程这一章。
IndirectStream(HTTP是其继承类)和AtomStream与Stream是包容关系,例如AtomStream包含Stream类型的对象,并提供各种函数对Stream类型的对象进行操作。
class AtomStream
{
Stream &io;
}
void AtomStream::writeInt(ID4 id,int d)
{
io.writeID4(id);
io.writeInt(4);
io.writeInt(d);
}