详解接口在中接口类用于表示一个标注你的事件处理器其定义了事件通知相关的逻辑包含和两个枚举类分别代表了通知状态和事件类型同时定义了事件的回调方法触发条件增删改重复修改也会触发因为他只告诉你变更了不告诉你变更多少需要自己去拿是接口中的回调方法当向客户端发送一个时间通知时客户端就会对相应的方法进行回调从而实现对事件的处理方法设置是开发中最常见的需要搞清楚的一些基本特征对于对于节点的不同操作会收到不同的信息对父节点的变更以及子节点的变更都不会触发而对本身节点以及子节点的变更会触发继续使用对象封装服务端事件并传递给从而方便回调方法对服务端事件进行处理实体实现了序列化接口因此可以用于网络传输数据结构如下会话超时状态认证失败状态连接建立中暂时不清楚如何理解这个状态连接已建立状态无连接状态创建节点事件删除节点事件更改节点事件子节点列表变化事件会话事件监控被移除事件发送过程当服务端产生事件之后会调用方法将自己包装成一个可序列化的事件以便于通过网络传输到客户端客户端在接收到服务端的这个事件对象后首先会将事件还原成一个事件并传递给方法处理回调方法根据传入参数解析完整服务端事件发送的数据无论是还是他对服务端事件的封装都是极其简单的当节点发生变更时服务端会发送给客户端一个数据变更事件客户端也只能接收到如下信息也就是说客户端无法直接从该事件中获取到对应数据节点的原始数据内容以及变更后的新数据内容而是客户端再次主动去重新获取数据这个也是一个非常重要的特性工作机制服务端发送不处理逻辑客户端发送并处理逻辑客户端注册创建一个客户端对象实例时可以传入一个这个将作为整个回话期间的默认会一直被保存在客户端的中另外客户端也可以通过和三个接口来向服务器注册列举个例第一个通过一个参数来标识是否使用默认进行注册具体注册逻辑与第二个接口一致注册后在接口注册后客户端首先会对当前客户端请求进行标记将其设置为使用监听同时会封装一个的注册信息对象用于暂时保存数据节点的路径和的对应关系与类在中可以看做是一个最小的通信协议单元用于进行客户端与服务端之间的网络传输任何需要传输的对象都需要包装成一个对象因此在中又会被封装到中去然后放入发送队列中等待客户端发送随后客户端就会向服务端发送这个请求同时等待请求的返回完成请求发送后会由客户端线程的方法负责接收来自服务端的相应方法会从中取出对象的并注册到中去封装到了对象中去但事实上在底层的网络传输过程中没有将对象完全的序列化到底层字节数组中去只会将和两个属性进行序列化也就是说即使对象呗封装在了中但是并没有被序列化到底层字节数组中去因此也就不会进行网络传输了客户端的注册流程如下服务端注册服务端处理的序列图中会判断当前请求是否是需要注册如果判断当前客户端需要进行注册于是就会将当前的对象和数据路径传入方法中去是一个客户端和服务器之间的连接接口代表了一个客户端和服务器的连接我们可以看做是一个对象因为他实现了的接口是服务端的管理者其内部管理的和两个存储结构分别从两个维度对进行存储是从数据节点路径的粒度管理是从的粒度来控制事件触发的数据节点在服务端中会托管两个分别是数据变更和子节点变更触发逻辑封装将通知状态事件类型节点路径封装成一个对象查询根据路径从中取出对应的若无没注册直接退出若有注册过将数据提取出来同时从中删除掉在服务端也是一次性的调用方法触发会把当前请求对应的作为一个存储因此调用方法事实上就是对应的方法客户端回调反序列化字节流转换成对象处理如果客户端设置了属性那么需要对服务器传过来的完整节点路径进行处理生成客户端的一个相对节点路径例如客户端路径那么针对服务端传过来的相应包含的节点路径为经过处理后会变成一个相对路径还原转换成回调最后将对象交给线程在下一个轮询周期中进行回调处理时间通知接收到服务端的通知事件后会通过调用方法将事件传给线程方法首先会根据该通知事件从中取出所有相关的客户端识别出事件类型后会从相应的存储即个注册方法中去除对应的获取到相关的所有后会将其放入这个队列去注意此处调用的是接口客户端的同样也是一次性的即一旦被触发该就失效了个注册方法或中的一个或多个是一个待处理的队列的方法会不断对该队列进行处理特性总结一次性一旦一个被触发都会将其从相应的存储中移除因此开发人员在的使用上需要重复注册客户端串行执行客户端回调是一个串行同步的过程这里是为了保证顺序所以设计时千万不要为了一个影响了整个客户端的回调轻量是整个通知机制的最小通知单元这个数据结构只有部分通知状态事件类型和节点路径也就是说只会告诉客户端那个节点发生了什么事件而不会说明具体内容需要客户端主动重新去获取数据这个是机制的一个重要特性另外客户端向服务端注册的时候并不会吧客户端真实的对象传递到服务端而是充值在客户端请求中使用类型属性进行了标记同时服务端也仅仅保存了当前连接的如此轻量的机制设计在网络开销和服务端内存开销上都是非常廉价的