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之后再往客户端发送。

你好!要在微信小程序中接入 WebSocket,你可以按照以下步骤进行操作: 1. 确保你的后端服务器支持 WebSocket 协议。WebSocket 是一种持久化的协议,可以在客户端和服务器之间建立双向通信通道。 2. 在微信小程序中,可以使用 `wx.connectSocket` 方法创建 WebSocket 连接。你需要提供 WebSocket 的 URL。 3. 监听 WebSocket 的连接成功事件,并在事件回调函数中编写相关的逻辑。例如: ```javascript wx.connectSocket({ url: 'wss://your-websocket-url', success: function () { console.log('WebSocket连接成功'); } }); wx.onSocketOpen(function () { console.log('WebSocket连接已打开'); }); ``` 4. 监听 WebSocket 的接收消息事件,并在事件回调函数中处理服务器发送的消息。例如: ```javascript wx.onSocketMessage(function (res) { console.log('收到服务器消息:', res.data); // 处理消息逻辑 }); ``` 5. 如果需要向服务器发送消息,可以使用 `wx.sendSocketMessage` 方法。例如: ```javascript wx.sendSocketMessage({ data: 'Hello, server!', success: function () { console.log('消息发送成功'); } }); ``` 6. 在小程序页面关闭时,需要手动关闭 WebSocket 连接。可以使用 `wx.closeSocket` 方法。例如: ```javascript wx.onUnload(function () { wx.closeSocket({ success: function () { console.log('WebSocket连接已关闭'); } }); }); ``` 请注意,微信小程序对 WebSocket 的使用有一些限制,例如连接的域名必须是在小程序后台配置的合法域名,同时需要在小程序的 `app.json` 文件中声明相关权限。 希望以上信息能对你有所帮助!如有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值