websocket-cometd使用(一)

 

说明

基于jetty的webosket模块,编写的框架

针对客户端支持websoket 则通过websoket交互

这对客户端不支持websoket 则通过长轮询进行交互

以及支持跨域的jsonp交互

官网介绍

CometD是一个可扩展的 Web 事件路由总线,允许您编写低延迟、服务器端、事件驱动的 Web 应用程序。此类应用程序的典型示例是股票交易应用程序、网络聊天应用程序、在线游戏和监控控制台。

CometD 为您提供 API 来实现这些消息传递模式:发布/订阅、点对点(通过服务器)和远程过程调用。这是使用独立于传输的协议Bayeux 协议来实现的,该协议可以通过 HTTP 或WebSocket(或其他传输协议)进行传输,因此您的应用程序不会绑定到特定的传输技术。

CometD 尽可能利用 WebSocket(因为它是最有效的 Web 消息传递协议),并在使用 HTTP 时利用称为Comet的Ajax推送技术模式。

CometD 项目提供 Java 和 JavaScript 库,允许您以简单且可移植的方式编写低延迟、服务器端、事件驱动的 Web 应用程序。

因此,您可以专注于应用程序的业务方面,而不必担心传输(HTTP 或 WebSocket)、可伸缩性和稳健性等低级细节。CometD 库提供了后一种特性。

 

 

 

 

官网

https://cometd.org/

github下载

https://github.com/cometd/cometd

我选的是5.0.x依赖jdk7  jetty9.4.x

 

 

jetty下载

下载9.4.x版本

http://www.eclipse.org/jetty/

导入idea

 目录结构说明 

cometd-archetypes    - The Maven archetypes for quick application development  maven打包配置
cometd-demo          - Demo of the Java server and of the Dojo/jQuery clients  演示demo
cometd-documentation - The CometD documentation
cometd-java          - The Java server and java client libraries  java服务和java客户端
cometd-javascript    - The JavaScript (Dojo/jQuery) client libraries  javascript客户端

执行maven打包

$ mvn install

 

启动方式1

$ cd cometd-demo
$ mvn jetty:run

启动方式2

因为我会打断点调试阅读代码我选择第二种

如果没有jetty选项需要安装插件 idea jetty runner

 

 

配置war包

 

访问

dojo为禁用websoket使用长连接的方式

jquery为优先websoket 不支持websoket使用长连接

vanilla为jsonp的方式

 

 

 

 

 

 

 

 

待定

 

 

 

 

 

 

 握手地方

org.cometd.server.ServerSessionImpl#handshake

 


长连接续约机制

首先创建并返回会话信息以及续约超时时间
/cometd/handshake
[{"minimumVersion":"1.0","clientId":"ri5utn9wwd1vu1xs4w1gukw5mx","supportedConnectionTypes":["websocket","long-polling","callback-polling"],"advice":{"interval":0,"timeout":30000,"reconnect":"retry"},"channel":"/meta/handshake","id":"15","version":"1.0","successful":true}]

一个长连接里面每次发送2个请求
1.第一个请求获取消息数据信并且将expireTime设置为now + interval + this._maxInterval;
2.第二个发送心跳包到服务端服务端把expireTime改为0 同时_messageTime 改为now
如果在第二个心跳包未发送续约请求 则会触发过期回收session

/cometd/connect
[{"channel":"/meta/connect","id":"24","successful":true}]

断开链接
会只会发送第一个请求,过期则会触发回收


连接已经被回收获取已过期会返回-> 402::Unknown client 或者链接已经过期

 

 

 

长连接处理地方
org.cometd.server.CometDServlet#service


设置scheduler到request的地方
org.cometd.server.transport.AbstractHttpTransport#processMetaConnect
->
org.cometd.server.transport.AbstractStreamHttpTransport#suspend
request.getAttribute("org.cometd.scheduler")


定时任务
org.cometd.server.transport.AbstractHttpTransport.LongPollScheduler#schedule


清除session的地方
org.cometd.server.BayeuxServerImpl#doStart
->
org.cometd.server.ServerSessionImpl#sweep #判断是否过期移除session
->
org.cometd.server.BayeuxServerImpl#removeServerSession
->
org.cometd.server.ServerSessionImpl#removed
->
org.cometd.server.transport.AbstractHttpTransport#processMetaHandshake


主动续约的地方
org.cometd.server.ServerSessionImpl#cancelExpiration
cancelExpiration:544, ServerSessionImpl (org.cometd.server)
handle:660, BayeuxServerImpl (org.cometd.server)
handle:647, BayeuxServerImpl (org.cometd.server)
bayeuxServerHandle:492, AbstractHttpTransport (org.cometd.server.transport)
processMessages:204, AbstractHttpTransport (org.cometd.server.transport)
process:33, AbstractJsonpTransport (com.ewei.support.cometd.server.transport.jsonp)
handle:50, AbstractStreamHttpTransport (org.cometd.server.transport)
service:92, CometDServlet (org.cometd.server)

未主动续约
scheduleExpiration:557, ServerSessionImpl (org.cometd.server)
write:152, AbstractStreamHttpTransport (org.cometd.server.transport)
flush:344, AbstractHttpTransport (org.cometd.server.transport)
resume:357, AbstractHttpTransport (org.cometd.server.transport)
callSuperResume:49, AbstractJsonTransport (com.ewei.support.cometd.server.transport.json)
doResume:26, JsonTransport (com.ewei.support.cometd.server.transport.json)
process:40, AbstractJsonTransport (com.ewei.support.cometd.server.transport.json)
handle:50, AbstractStreamHttpTransport (org.cometd.server.transport)
service:92, CometDServlet (org.cometd.server)
run:748, Thread (java.lang)


长连接 默认会每隔一段时间完成续约,如果是续约则将expireTime改为0
当用户断开连接会触发unown断开连接服务端处理调用未主动续约
messageTime为上一次续约时间

posted @ 2022-07-07 18:13  意犹未尽  阅读(539)  评论(0编辑  收藏  举报