一、环形缓冲区
环形缓冲区就是一个环形的东西,里面的数据头、尾结合在一起,形成了环形缓冲区。环形缓冲区有一个特点,当一个数据元素被删掉之后,其余的元素不需要移动它的位置。同时,它满足先进、先出的规则,缓冲区比较适合最开始确定的一个最大容量的情况下,那么,往里面填充数据,最终读取数据的过程。
在桥接模式中,需要把数据接收下来,然后再发送到另一个客户端。但是,由于同时存在接收和发送,而发送和接收是两个不同的连接,它的发送速度和接收速度不一定相同,此时需要这样一个缓冲区,做一个同步的操作。当接收速度远远大于发送速度的时候,将数据接收到缓冲区当中,等待它一点点地发送。同时,为了避免重复地去覆盖该内容,我们采用环形缓冲区的方式,用来维护整个数据集合。
这张图代表了在环形缓冲区中填充了部分数据的情况,从Head一直填充到了Tail的位置。环形缓冲区在内存中并不是一个环形的,它只是一个数组或是一个链表,链表是一个可以随时扩充环形缓冲区的容量双向或单向链表,常见的是用数组来表示。之所以说它是环形缓冲区,是从逻辑上来说的
二、环形缓冲区的结构
准备开始读写
写数据:
读数据:
读数据到末尾:
继续读取数据,覆盖原来的数据:
如果再继续写入数据,当End和Start相等时,代表整个缓冲区是空的,此时,该如何解决这个问题呢?将其中一个存储坐标不存储数据,当写数据的时候,永远写到当前读坐标的后面一位,也就是说读坐标后面一位永远不写入数据。
二、类
CircularByteBuffer : 环形缓冲区
BufferOverflowException : 缓冲区所产生的异常
BridgeSocketDispatcher : 桥接分发的Dispatcher
AudioRoom : 房间的基本封装
三、桥接原理
在桥接原理当中,首先是有两个客户端,也就是A连接和B连接,两个连接都有一个发送和接收,发送和接收代表了我们的输出和输入流。
此时,在A连接上启动桥接模式,在启动的时候,会启动一个A BridgeSocketDispatcher,也就是桥接的调度器。当桥接的调度器初始化的时候,需要将A连接的Receiver传递进去,也就是当前的Bridge本身就依赖了当前A连接的接收者。同样的,B也启动这样的桥接模式,在启动的时候,同样也会启动B的桥接调度器,同样也持有了B连接的接收者。
那应该怎么做,才能完成整个的桥接过程呢?把B的发送者添加到A的桥接当中去,这样,在A的桥接调度器中就持有了A的接收者和B的发送者。同理,可以对B做相同的处理。
此时,双方互相是一个交叉的关系。当在A的BridgeSocketDispatcher中接收数据时,接收到数据会放到环形缓冲区,在环形缓冲区中的内容会缓冲起来,然后再通过B的sender进行发送。这样就实现了将A连接的数据发送给了B连接。同样,在B的BridgeDispatcher中也进行同样的操作,将B接收到的数据通过A的sender发送出去。
四、服务器桥接改造难点
五、客户端按顺序添加的处理链
六、绑定连接
七、创建房间
八、移除房间
九、加入房间