目录
消息推送常见方式
WebSocket
客户端(浏览器)API
服务端 API
定义Endpoint
Endpoint生命周期
服务端接收和推送
消息推送常见方式
- 轮询。
- 浏览器以指定时间间隔向服务器发送http请求,服务器再将结果返回给浏览器。
- 延迟+服务器压力。
- 长轮询。
- 浏览器发出ajax请求,服务器接收到请求不会立马返回,而是阻塞请求直到有数据或者超时才返回。
- SSE。(server-sent event)(服务器发送事件)
- 在服务器和浏览器之间开一个单向通道。(服务器到浏览器)
- 服务器响应的不再是一次性的数据包,而是数据流信息。当服务器有数据变更时将数据流式传输到客户端。
- websocket。
- 基于tcp连接,进行“全双工”通信协议(允许同时的双向传输数据)。
- 而对于“半双工”,虽然允许数据在两个方向上传输,但是同一个时间段内只允许一个方向上传输。
- 从http协议切换到websocket协议,再去进行双向的数据传输。
WebSocket
客户端(浏览器)API
- websocket对象创建。
- URL格式:协议://ip地址:端口/访问路径。
let ws = new WebSocket(URL)
事件 |
事件处理程序 |
描述 |
open |
ws.onopen |
连接建立时触发 |
message |
ws.onmessage |
客户端接收到服务器发送的数据时触发 |
close |
ws.onclose |
连接关闭时触发 |
error |
ws.onerror |
连接过程中发生错误时触发 |
方法名 |
描述 |
send() |
通过websocket对象调用该方法发送数据给服务端 |
<script>
let ws = new WebSocket("ws://xxx/xxx")
ws.onopen = function (){
//连接成功时触发
};
ws.onmessage = function (event){
//使用event.data获取服务器发送的数据
};
ws.onclose = function (){
//连接断开时触发
};
ws.onerror = function (error){
//连接错误时触发
};
</script>
服务端 API
- tomcat7之后的版本后开始陆续支持websocket,也实现了 java websocket 规范。
- java websocket 应用说由一系列的Endpoint组成。Endpoint是一个java对象,代表java websocket 链接的一端,对于服务端,可以视为处理具体 websocket 消息的接口。也就是专门处理服务器与客户端建立一对一链接通信。
- 编程式:继承
javax.websocket.Endpoint
并实现其方法。
- 注解式:定义一个POJO,并添加@ServerEndpoint等相关生命周期注解。
Endpoint生命周期
- Endpoint实例在websocket握手时创建,并在客户端与服务器链接过程中有效,最后在链接关闭时结束。
- Endpoint接口中声明和定义了相关生命周期方法,规范实现者确保生命周期的各个阶段调用实例的相关方法,方法如下:
方法 |
描述 |
注解(常用) |
onOpen() |
当开启一个新会话时调用,该方法是客户端与服务端握手成功后调用的方法 |
@OnOpen |
onClose() |
当会话关闭时调用 |
@OnClose |
onError() |
当连接过程异常时调用 |
@OnError |
- 接收。编程式(MessageHandler消息处理器)。注解式(定义Endpoint时,通过@OnMessage注解指定接收信息的方法)。
- 推送(发送)。RemoteEndPoint完成,其实例由Session维护。
- 发送消息的两种方式:session.getBasicRemote(获取同步消息发送的实例,然后调用其sendXXX()方法发送消息)、session.getAsyncRemote(获取异步消息发送的实例,然后调用其sendXXX()方法发送消息)。这里的同步与异步:是否阻塞当前线程、是否等待结果。
- 发送文本信息:sendText()。
@ServerEndpoint("/chat")
@Component
public class ChatEndpoint {
//websocket Session
//连接创建时被调用
@OnOpen
public void onOpen(Session session, EndpointConfig config) {
}
//接收到客户端发送的数据时被调用
@OnMessage
public void onMessage(String message, Session session) {
}
//连接关闭时被调用
@OnClose
public void onClose(Session session) {
}
//发生错误时被调用
@OnError
public void onError(Session session, Throwable error) {
}
- 具体的实现(springboot整合websocket)下篇博客发。
- 有简单的前端可视化哦。。。