服务器桥接改造实现

43 篇文章 3 订阅

一、环形缓冲区

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

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

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

 

四、服务器桥接改造难点

 

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

 

六、绑定连接

七、创建房间

八、移除房间

九、加入房间

桥接模式是一种设计模式,它用于将抽象部分与实现部分分离,使它们可以独立地变化。在Java中,桥接模式可以用于实现格式转换。 下面是Java桥接模式实现格式转换的基本步骤: 1. 定义抽象类(Abstraction):抽象类定义了抽象部分的接口,并包含一个对实现部分对象的引用。 2. 定义实现类接口(Implementor):实现类接口定义了实现部分的接口。 3. 创建具体实现类(ConcreteImplementor):具体实现实现实现类接口,并提供具体的实现逻辑。 4. 创建具体抽象类(ConcreteAbstraction):具体抽象类继承了抽象类,并实现了抽象部分的接口。 5. 在具体抽象类中调用实现部分的方法:在具体抽象类中,通过调用实现部分对象的方法来完成格式转换。 下面是一个简单的Java桥接模式实现格式转换的示例代码: ```java // 定义抽象类 abstract class FormatConverter { protected FormatImplementor implementor; public FormatConverter(FormatImplementor implementor) { this.implementor = implementor; } public abstract void convert(); } // 定义实现类接口 interface FormatImplementor { void convertFormat(); } // 创建具体实现类 class XMLFormatImplementor implements FormatImplementor { @Override public void convertFormat() { System.out.println("将数据转换为XML格式"); } } class JSONFormatImplementor implements FormatImplementor { @Override public void convertFormat() { System.out.println("将数据转换为JSON格式"); } } // 创建具体抽象类 class DataConverter extends FormatConverter { public DataConverter(FormatImplementor implementor) { super(implementor); } @Override public void convert() { implementor.convertFormat(); } } // 使用示例 public class Main { public static void main(String[] args) { FormatImplementor xmlImplementor = new XMLFormatImplementor(); FormatImplementor jsonImplementor = new JSONFormatImplementor(); FormatConverter xmlConverter = new DataConverter(xmlImplementor); xmlConverter.convert(); // 输出:将数据转换为XML格式 FormatConverter jsonConverter = new DataConverter(jsonImplementor); jsonConverter.convert(); // 输出:将数据转换为JSON格式 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值