github上比较流行的java websocket框架,主要包括以下内容:
1.WebSocketServer对象
server的入口,每次都只需要创建一个实例,可以接受所有的websocket请求,内部采用NIO作为底层io框架,主要有两部分组成:
- run()方法中用while创建一个循环,不断轮训NIO的channel,处理的内容包括:接收NIO请求(isAcceptable),进行read操作(key.isReadable()),进行写操作(key.isWritable()),对所有webSocket对象中剩余尚未处理的消息进行处理。
- 其余部分继承了WebSocketListener接口,这个接口主要包括收到消息(onMessage),socket接口打开(onOpen),socket接口关闭(onClose)等方法。主要用途是,这个类包含了很多WebSocket,采用CopyOnWriteArraySet类保存为connections字段名,如果socket打开或关闭,需要更新connections对象,删除或者加入websocket。某个websocket接收到消息之后,交给这个类来进行统一处理,例如,给所有的websocket实例发送该消息(sendToAll),或者对部分webSocket实例发送消息(sendToAllExcept)。
2.WebSocket对象
单个websocket进程session表示的对象。里面包括握手协议,读写消息帧的处理。
- handleRead方法,处理消息的入口,首先判断是否完成握手协议,如果完成的话,直接将消息转化成List<Framedata>对象,然后对每帧进行处理,帧包括Opcode,fin,以及二进制数据内容(payloadData)等对象。根据opCode有不同的处理方式。如果尚未完成握手协议,需要先进行handshake。如果创建websocket对象时候,已经指定了Draft的话,就直接用该draft进行translateHandshake操作,然后获取handshakeState,如果state是matched,则进行下一步操作。如果没有指定Draft,则遍历每个draft然后进行验证,获得正确的draft之后,发送给客户端相应的draft包含的头信息。
- 这个类包含了一个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】Android 端 WebSocket 基本用法 ( 下载 Java-WebSocket源码 | 导入 Java-WebSocket-1.5.2 工程作为依赖 ) https://hanshuliang.blog.csdn.net/article/details/123633108 博客源码快照
TooTallNate-Java-WebSocket-05d2e2e是这个库的一个特定版本的源代码,由开发者TooTallNate维护。这个版本可能包含了一些特定的改进、修复或功能。 在这个源码中,我们可以深入理解以下关键知识点: 1. **...
标题提到的"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项目中用于WebSocket通信的相关起步依赖。WebSocket是一种在客户端和服务器之间建立长连接的协议,使得实时双向通信成为可能...
WebSocket-FMP4与WebSocket-FLV视频播放器在Web端的应用是现代互联网实时通信技术的重要实践,其中wsplayer是一款常见的实现此类功能的播放器。本文将深入探讨WebSocket协议、FMP4与FLV格式以及wsplayer播放器的相关...
java代码-使用java解决websocket的问题的源代码 ——学习参考资料:仅用于个人学习使用!
JavaWebsocket 1.5.2 jar包
干脆用java自己写了个小程序,性能当然和squid、nginx之类的没法比,还好我们的系统负荷不是很重,运行了一个星期基本没问题。 附件是该 java 程序包。 使用方法: 1。 安装java 2。在命令行输入: java -jar ...
java-webSocket是免费的,集成java-webSocket开源而成的一个比较完整的demo,实现了客户端向服务端发送消息,以及接收由服务端主动发送给客户端的消息,以及开启心跳,断连后重新连接。适用于需要双方相互主动互发...
Java-WebSocket jar包,封装WebSocket实现。
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
在这个名为"Java-WebSocket-master"的源码包中,你可以找到完整的源代码,包括API接口、核心处理逻辑以及相关的示例。 1. **核心概念:** - **WebSocketClient**:这是客户端的核心类,用于与WebSocket服务器建立...
spring-cloud-netflix-zuul-websocket, Zuul反向代理网络套接字支持 spring-cloud-netflix-zuul-websocketspring 应用程序中支持Zuul反向代理web套接字支持的简单库。用法spring-cloud-netflix-zuul-websocket可以从...
java运行依赖jar包
java运行依赖jar包
`Java-WebSocket-1.3.1-SNAPSHOT.jar` 是这个库的最新版本,SNAPSHOT标识通常表示这是一个开发中的不稳定版本,可能包含未发布的特性或修复。这个jar文件包含了所有必要的类和方法,用于创建、管理和操作WebSocket...
在`robust-websocket-master`这个压缩包中,通常会包含源代码、README文件(介绍项目的使用方法、安装步骤和常见问题)、示例代码以及可能的测试用例。开发者可以下载解压后,按照文档的指示进行安装和使用,将`...
websocket前后台数据交互失败,并且报java.lang.IncompatibleClassChangeError
java写的websocket客户端,包含心跳监测。 此架包可解决问题:系统使用websocket 访问远程上的实时数据,但是有时候会停止更新实时数据,只要重启了自己的系统,就会继续更新数据了,此包可以完美解决此问题。