消息推送与 WebSocket 学习

目录

消息推送常见方式

WebSocket

客户端(浏览器)API

[服务端 API](#服务端 API)

定义Endpoint

Endpoint生命周期

服务端接收和推送


消息推送常见方式

  • 轮询。
  • 浏览器以指定时间间隔向服务器发送http请求,服务器再将结果返回给浏览器。
  • 延迟+服务器压力。

  • 长轮询。
  • 浏览器发出ajax请求,服务器接收到请求不会立马返回,而是阻塞请求直到有数据或者超时才返回。

  • SSE。(server-sent event)(服务器发送事件)
  • 在服务器和浏览器之间开一个单向通道。(服务器到浏览器)
  • 服务器响应的不再是一次性的数据包,而是数据流信息。当服务器有数据变更时将数据流式传输到客户端。

  • websocket。
  • 基于tcp连接,进行"全双工"通信协议(允许同时的双向传输数据)。
  • 而对于"半双工",虽然允许数据在两个方向上传输,但是同一个时间段内只允许一个方向上传输。
  • 从http协议切换到websocket协议,再去进行双向的数据传输。

WebSocket

客户端(浏览器)API

  • websocket对象创建。
  • URL格式:协议://ip地址:端口/访问路径。
javascript 复制代码
let ws = new WebSocket(URL)

  • websocket对象相关事件。
事件 事件处理程序 描述
open ws.onopen 连接建立时触发
message ws.onmessage 客户端接收到服务器发送的数据时触发
close ws.onclose 连接关闭时触发
error ws.onerror 连接过程中发生错误时触发

  • websocket对象提供的方法。

| 方法名 | 描述 |

send() 通过websocket对象调用该方法发送数据给服务端

javascript 复制代码
<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 消息的接口。也就是专门处理服务器与客户端建立一对一链接通信。

定义Endpoint
  1. 编程式:继承**javax.websocket.Endpoint** 并实现其方法。
  2. 注解式:定义一个POJO,并添加@ServerEndpoint等相关生命周期注解。

Endpoint生命周期
  • Endpoint实例在websocket握手时创建,并在客户端与服务器链接过程中有效,最后在链接关闭时结束。
  • Endpoint接口中声明和定义了相关生命周期方法,规范实现者确保生命周期的各个阶段调用实例的相关方法,方法如下:
方法 描述 注解(常用)
onOpen() 当开启一个新会话时调用,该方法是客户端与服务端握手成功后调用的方法 @OnOpen
onClose() 当会话关闭时调用 @OnClose
onError() 当连接过程异常时调用 @OnError

服务端接收和推送
  1. 接收。编程式(MessageHandler消息处理器)。注解式(定义Endpoint时,通过@OnMessage注解指定接收信息的方法)。
  2. 推送(发送)。RemoteEndPoint完成,其实例由Session维护。
  3. 发送消息的两种方式:session.getBasicRemote(获取同步消息发送的实例,然后调用其sendXXX()方法发送消息)、session.getAsyncRemote(获取异步消息发送的实例,然后调用其sendXXX()方法发送消息)。这里的同步与异步:是否阻塞当前线程 、是否等待结果。
  4. 发送文本信息:sendText()。

java 复制代码
@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)下篇博客发。
  • 有简单的前端可视化哦。。。
相关推荐
爱和冰阔落1 小时前
【Linux网络】TCP 半包粘包怎么解决?从长度报头、JSON 拆包到网络计算器完整实战
linux·运维·网络·tcp/ip
say_fall3 小时前
【Linux网络编程】UDP套接字编程:系统编程组件、基础回显服务、InetAddr与地址转换、翻译服务与线程池聊天室
linux·服务器·网络·udp·vr
我不会插花弄玉15 小时前
6.传输层协议UDP【由浅入深-网络】
网络·网络协议·udp
火云代理16 小时前
更换网络后为什么会退出登录?分清 IP、Cookie 与会话的关系
服务器·网络·网络协议·tcp/ip·php·ip
xbzb18 小时前
容器 IP 每次重建都变?docker network 五种模式与自定义网桥固定地址
网络·docker·容器·ip·network·固定
火云代理19 小时前
同一个网站,有的网络能打开、有的打不开?认识 IPv4 与 IPv6 的访问差异
服务器·网络·网络协议·tcp/ip·测试工具·php·状态模式
坤坤子吖20 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
火云代理1 天前
Python 使用代理 IP 前,先弄清 Requests 的配置来源与验证方法
网络·python·网络协议·tcp/ip·ip
如夏倾城1 天前
QUIC——HTTP/3 的唯一底层传输协议 及 0-RTT恢复
网络·网络协议·tcp/ip·安全·http
科研邪修法1 天前
培训PDF保护配置:把需求转换成可验收权限
linux·服务器·网络