`

TooTallNate-Java-WebSocket源码解析

阅读更多

 

github上比较流行的java websocket框架,主要包括以下内容:

 

1.WebSocketServer对象

server的入口,每次都只需要创建一个实例,可以接受所有的websocket请求,内部采用NIO作为底层io框架,主要有两部分组成:

 

  1. run()方法中用while创建一个循环,不断轮训NIO的channel,处理的内容包括:接收NIO请求(isAcceptable),进行read操作(key.isReadable()),进行写操作(key.isWritable()),对所有webSocket对象中剩余尚未处理的消息进行处理。
  2. 其余部分继承了WebSocketListener接口,这个接口主要包括收到消息(onMessage),socket接口打开(onOpen),socket接口关闭(onClose)等方法。主要用途是,这个类包含了很多WebSocket,采用CopyOnWriteArraySet类保存为connections字段名,如果socket打开或关闭,需要更新connections对象,删除或者加入websocket。某个websocket接收到消息之后,交给这个类来进行统一处理,例如,给所有的websocket实例发送该消息(sendToAll),或者对部分webSocket实例发送消息(sendToAllExcept)。

2.WebSocket对象

单个websocket进程session表示的对象。里面包括握手协议,读写消息帧的处理。

 

  1. handleRead方法,处理消息的入口,首先判断是否完成握手协议,如果完成的话,直接将消息转化成List<Framedata>对象,然后对每帧进行处理,帧包括Opcode,fin,以及二进制数据内容(payloadData)等对象。根据opCode有不同的处理方式。如果尚未完成握手协议,需要先进行handshake。如果创建websocket对象时候,已经指定了Draft的话,就直接用该draft进行translateHandshake操作,然后获取handshakeState,如果state是matched,则进行下一步操作。如果没有指定Draft,则遍历每个draft然后进行验证,获得正确的draft之后,发送给客户端相应的draft包含的头信息。
  2. 这个类包含了一个SocketChannel对象,用这个对象进行消息的写操作,send, sendFrame, handleWrite, channelWrite方法都用来往socketChannel对象写入数据。

3.Handshakedata及其实现

主要用来存储握手数据,主要是类似http-head的结构,存储了key-value格式的信息,采用map类型存储。主要内容包括:Connection;Upgrade Sec-WebSocket-Key1;Sec-WebSocket-Key2;Origin等信息。

4.Framedata

存储websocket帧信息,类型有如下这几种:

enum Opcode{

CONTINIOUS,

TEXT,

BINARY,

PING,

PONG,

CLOSING

//more to come

}

5.Draft类及其实现:Draft_10,Draft_17,Draft_75,Draft_76等

主要包括了websocket协议的不同时期规范的实现,重点是在握手阶段。


存在的问题

针对一个socket请求的消息,会转化成多个FrameData,针对每个frameData处理的时候,都会往socketChannel写入数据,这样会导致socketChannel的频繁写入,作者在代码也标注了这个问题(Description Resource Path Location Type TODO high frequently calls to sendFrame are inefficient.WebSocket.java/TooTallNate-Java-WebSocket/src/net/tootallnate/websocket line 336 Java Task)。

另外WebSocket采用FrameData的好处是,同一个socket请求,可以包括很多FrameData,这样的话,客户端可以批量往服务器发送数据,WebSocket内建支持这种批量发送数据的方式,可以减少io量。服务器端也可以考虑累积一定量的FrameData之后再往客户端发送。

分享到:
评论

相关推荐

    Android WebSocket 用法 ( 导入 Java-WebSocket 源码依赖 )

    【Android WebSocket】Android 端 WebSocket 基本用法 ( 下载 Java-WebSocket源码 | 导入 Java-WebSocket-1.5.2 工程作为依赖 ) https://hanshuliang.blog.csdn.net/article/details/123633108 博客源码快照

    Java-WebSocket源码

    TooTallNate-Java-WebSocket-05d2e2e是这个库的一个特定版本的源代码,由开发者TooTallNate维护。这个版本可能包含了一些特定的改进、修复或功能。 在这个源码中,我们可以深入理解以下关键知识点: 1. **...

    java-WebSocket-1.3.7.jar和java-WebSocket-1.3.4.jar

    标题提到的"java-WebSocket-1.3.7.jar"和"java-WebSocket-1.3.4.jar"是这个库的两个不同版本,分别对应1.3.7和1.3.4的版本号。这两个版本的差异可能包括错误修复、性能优化、新功能的添加或API的调整。描述中提到的...

    spring-boot-starter-websocket.zip

    对于“spring-boot-starter-websocket.zip”这个压缩包,我们可以推断它包含了Spring Boot项目中用于WebSocket通信的相关起步依赖。WebSocket是一种在客户端和服务器之间建立长连接的协议,使得实时双向通信成为可能...

    websocket-fmp4、websocket-flv 视频播放器 web端 wsplayer

    WebSocket-FMP4与WebSocket-FLV视频播放器在Web端的应用是现代互联网实时通信技术的重要实践,其中wsplayer是一款常见的实现此类功能的播放器。本文将深入探讨WebSocket协议、FMP4与FLV格式以及wsplayer播放器的相关...

    java代码-使用java解决websocket的问题的源代码

    java代码-使用java解决websocket的问题的源代码 ——学习参考资料:仅用于个人学习使用!

    Java-WebSocket-1.5.2.jar

    JavaWebsocket 1.5.2 jar包

    HTTPS 代理-SNI Proxy-WebSocket-Java

    干脆用java自己写了个小程序,性能当然和squid、nginx之类的没法比,还好我们的系统负荷不是很重,运行了一个星期基本没问题。 附件是该 java 程序包。 使用方法: 1。 安装java 2。在命令行输入: java -jar ...

    WebSocket.rar Android java-webSocket完整案例源码,推送,即时通信,双向通信,心跳重连

    java-webSocket是免费的,集成java-webSocket开源而成的一个比较完整的demo,实现了客户端向服务端发送消息,以及接收由服务端主动发送给客户端的消息,以及开启心跳,断连后重新连接。适用于需要双方相互主动互发...

    Java-WebSocket-jar

    Java-WebSocket jar包,封装WebSocket实现。

    Java-WebSocket-1.5.1.jar中文-英文对照文档.zip

    中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...

    java websocket 源码包

    在这个名为"Java-WebSocket-master"的源码包中,你可以找到完整的源代码,包括API接口、核心处理逻辑以及相关的示例。 1. **核心概念:** - **WebSocketClient**:这是客户端的核心类,用于与WebSocket服务器建立...

    spring-cloud-netflix-zuul-websocket, Zuul反向代理网络套接字支持.zip

    spring-cloud-netflix-zuul-websocket, Zuul反向代理网络套接字支持 spring-cloud-netflix-zuul-websocketspring 应用程序中支持Zuul反向代理web套接字支持的简单库。用法spring-cloud-netflix-zuul-websocket可以从...

    spring-boot-starter-websocket-1.5.9.RELEASE.jar

    java运行依赖jar包

    spring-boot-starter-websocket-2.1.6.RELEASE.jar

    java运行依赖jar包

    java-websocket jar包

    `Java-WebSocket-1.3.1-SNAPSHOT.jar` 是这个库的最新版本,SNAPSHOT标识通常表示这是一个开发中的不稳定版本,可能包含未发布的特性或修复。这个jar文件包含了所有必要的类和方法,用于创建、管理和操作WebSocket...

    前端开源库-robust-websocket

    在`robust-websocket-master`这个压缩包中,通常会包含源代码、README文件(介绍项目的使用方法、安装步骤和常见问题)、示例代码以及可能的测试用例。开发者可以下载解压后,按照文档的指示进行安装和使用,将`...

    Java-WebSocket-1.4.0.jar

    websocket前后台数据交互失败,并且报java.lang.IncompatibleClassChangeError

    websocket demo(java客户端,心跳监测)

    java写的websocket客户端,包含心跳监测。 此架包可解决问题:系统使用websocket 访问远程上的实时数据,但是有时候会停止更新实时数据,只要重启了自己的系统,就会继续更新数据了,此包可以完美解决此问题。

Global site tag (gtag.js) - Google Analytics