服务器桥接改造实现

一、环形缓冲区

环形缓冲区就是一个环形的东西,里面的数据头、尾结合在一起,形成了环形缓冲区。环形缓冲区有一个特点,当一个数据元素被删掉之后,其余的元素不需要移动它的位置。同时,它满足先进、先出的规则,缓冲区比较适合最开始确定的一个最大容量的情况下,那么,往里面填充数据,最终读取数据的过程。

在桥接模式中,需要把数据接收下来,然后再发送到另一个客户端。但是,由于同时存在接收和发送,而发送和接收是两个不同的连接,它的发送速度和接收速度不一定相同,此时需要这样一个缓冲区,做一个同步的操作。当接收速度远远大于发送速度的时候,将数据接收到缓冲区当中,等待它一点点地发送。同时,为了避免重复地去覆盖该内容,我们采用环形缓冲区的方式,用来维护整个数据集合。

这张图代表了在环形缓冲区中填充了部分数据的情况,从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发送出去。

 

四、服务器桥接改造难点

 

五、客户端按顺序添加的处理链

 

六、绑定连接

七、创建房间

八、移除房间

九、加入房间

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章