首页 > 其他分享 >WebScoket学习笔记

WebScoket学习笔记

时间:2025-01-14 20:37:20浏览次数:1  
标签:websocket void 笔记 学习 session ws WebScoket public 客户端

WebScoket学习笔记


1. 消息推送常用方式介绍

轮询

浏览器以指定的时间间隔向服务器发出HTTP请求,服务器实时返回数据给浏览器。

image-20250109103523290

长轮询

浏览器发出ajax请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才返回。

image-20250109103936370

SSE

server-sent-event:服务器发送事件

SSE是在服务器和客户端之间打开一个单向通道,服务器通向客户端。

服务器响应的不再是一次性的数据包,而是text/event-stream类型的数据流信息。

服务器有数据变更时,将数据流式传输到客户端。

image-20250109104625870


2. WebSocket

2.1 介绍

WebSocket是一种在基于TCP连接上进行全双工通信的协议。

说明:

  • 全双工:允许数据在两个方向上同时传输。
  • 半双工:允许数据在两个方向上传输,但是同一个时间段内只允许一个方向上传输。

image-20250109105530021

2.2 客户端API

websocket对象创建

let ws = new WebSocket(URL);

URL说明

  • 格式:协议://ip地址:端口/访问路径
  • 协议:协议名称为ws

websocket对象相关事件

事件 事件处理程序 描述
open ws.onopen 连接建立时
message ws.onmessage 客户端接受到服务器发送到数据时触发
close ws.onclose 连接关闭时触发
error ws.onerror 发生错误时触发

websocket对象提供的方法

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

<script>
    let ws = new WebSocket("ws://localhost:8080/chat")
    ws.onopen = function (){

    }
    ws.onmessage = function (evt) {
        console.log(evt)
    }
    ws.onclose = function () {

    }
    ws.onerror = function (){

    }
</script>

2.3 服务端API

Tomcat的7.0.5版本开始支持websocket,并且实现了Java websocket规范。

Java websocket应用由一系列的Endpoint组成。Endpoint是一个java对象,代表WebSocket链接的一端,对于服务端,我们可以视为处理具体websocket消息的接口。

我们可以通过两种方式定义Endpoint:

  • 第一种是编程式,即继承类javax.websocket.Endpoint并实现其方法。
  • 第二种是注解式,即定义一个POJO,并添加@ServerEndpoint相关注解。

Endpoint实例在WebSocket握手时创建,并在客户端与服务端链接过程中有效,最后在链接关闭时结束。在Endpoint接口中明确定义了与其生命周期相关的方法,规范实现者确保生命周期的各个阶段调用实例的相关方法。生命周期方法如下:

方法 描述 注解
onOpen() 当开启一个新的会话时调用,该方法是客户端与服务器端握手成功后调用的方法 @OnOpen
onClose() 当会话关闭时调用 @OnClose
onError() 当连接过程异常时调用 @OnError

服务器端接受客户端数据

  • 编程式

    通过添加MessageHandler消息处理器来接收消息

  • 注解式

    在定义Endpoint时,通过@OnMessage注解指定接收消息的方法

服务器端推送数据到客户端

发送消息则由RemoteEndpoint完成,其实例由Session维护。

发送消息有2种方式

  • 通过session.getBasicRemote获取同步消息发送的实例,然后调用其sendXXX()方法发送消息。
  • 通过session.getAsyncRemote获取异步消息发送实例,然后调用其sendXXX()方法发送消息。
@ServerEndpoint("/chat")
@Component
public class ChatEndpoint {
  @OnOpen
  public void onOPen(Session session,EndPointConfig config){
    
  }
  
  @OnMessage
  public void onMessage(String message){
    
  }
  
  @OnClose
  public void onClose(Session session){
    
  }
}

3. 总结

新建SpringBoot项目,导入依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

编写配置类,扫描所有添加@ServerEndpoint注解的Bean

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

编写配置类,用户获取HttpSession对象

@Configuration
public class GetHttpSessionConfigurator extends ServerEndpointConfig.Configurator {
    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        HttpSession session = (HttpSession) request.getHttpSession();
        // 将HttpSession对象存储到配置对象中
        sec.getUserProperties().put(HttpSession.class.getName(), session);
    }
}

@ServerEndpoint注解中引入配置器

@ServerEndpoint(value = "/chat",configurator = GetHttpSessionConfigurator.class)

创建ChatEndPoint

@Component
@ServerEndpoint(value = "/chat",configurator = GetHttpSessionConfigurator.class)
public class ChatEndpoint {
    private static final Map<String, Session> onlineUsers = new ConcurrentHashMap<>();
    private HttpSession httpSession;

    @OnOpen
    public void onOpen(Session session, EndpointConfig config) {
        this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());

    }
    public void broadcastAllUser(){

    }
    @OnMessage
    public void onMessage(String message, Session session) {

    }
    @OnClose
    public void onClose(Session session, CloseReason closeReason) {

    }
}

服务器向客户端发送消息:

session.getAsyncRemote().sendText("...");

客户端向服务器发送消息:

let ws = new WebSocket("ws://localhost:8080/chat")
ws.send("xxx");

标签:websocket,void,笔记,学习,session,ws,WebScoket,public,客户端
From: https://www.cnblogs.com/mango0219/p/18671520

相关文章

  • Agent学习
    最新AIAgent万字综述分享!Anthropic最新:AIAgents2024年度总结!AIAgent=大模型+记忆+规划+工具使用两种思维方式:CoT和ReAct,都可以通过Prompt的设计来控制构建块、工作流和Agent构建块:增强型LLM工作流程:提示链接工作流程:路由工作流程:并行化工作流程:Orchestrator......
  • 关于python的初步学习
    python中的数据类型:整数(int):用于表示整数,例如-5,0,10等。浮点数(float):用于表示小数,例如3.14,-0.5等。字符串(str):用于表示文本,例如"Hello",'World'等。布尔值(bool):用于表示真或假,只有两个值,True和False。列表(list):用于存储一组有序的数据,可以包含不同类型的元素,例如[1,2,3]......
  • 嵌入式学习录2
    数据类型运算符和表达式一、什么是编程用编程语言把人类的思想告诉计算机,让计算机解决人类的问题。是人类与计算机“交流”的途径。编程语言有很多种类:C语言pythonjava......等,本文章主要学习C语言。1、学习目标(1)语法//格式(2)编程思维 //思路(3)编程习惯二、常量......
  • 嵌入式学习录3
    书接上回数据类型运算符和表达式(2)一、转义字符及字符常量转义字符是由反斜杠\将后面的字符转换成其他的意义以下为转义字符及其作用:二、算术运算符+  加法-  减法*  乘法/  除法   注:1.如果是两个整型数相除效果相当于是整除    ......
  • ROCKETMQ学习
    1.RocketMQ介绍RocketMQ是一款由阿里巴巴开源的分布式消息中间件。它具有低延迟、高吞吐量、高可用性和高可靠性等特点,适用于构建具有海量消息堆积和异步解耦功能的应用系统。1.1.基本概念●生产者(Producer):也称为消息发布者,是RocketMQ中用来构建并传输消息到服务端的运行实体......
  • 江科大STM32入门——读写备份寄存器(BKP)&实时时钟(RTC)笔记整理
    wx:嵌入式工程师成长日记https://mp.weixin.qq.com/s/hDk7QaXP8yfYIj1gUhtMrw?token=1051786482&lang=zh_CNhttps://mp.weixin.qq.com/s/hDk7QaXP8yfYIj1gUhtMrw?token=1051786482&lang=zh_CNRTC是一个独立的定时器,BKP并不能完全掉电不丢失,其可以完成一些主电源掉电时,保存少......
  • EPLAN P8 学习笔记 配图 20250114
    组织结构、细节会生疏。Pageproperties-Fullpagename、Pagetype、PagedescriptionFullpagename-StructureidentifiersMainProjecttree-IdentifierStructurePageTypeNameDescriptionPagesObject元素structure结构identifier.excalidrawProjectData-S......
  • 2024秋季学期 理论力学期末复习笔记
    参考资料[1]秦敢,向守平.力学与理论力学(下册)[M].科学出版社,2017.8.[2]曹利明.理论力学课程讲义[Z].中国科学技术大学,2024.拉格朗日力学哈密顿力学刚体部分......
  • 字典学习方法
    字典学习方法是机器学习中的一种技术,它旨在从数据中学习一个有效的字典,以便更好地表示或分类数据。以下是对字典学习方法的详细介绍:一、定义与原理字典学习方法通过从训练数据中学习一个过完备的字典矩阵,使得数据可以表示为字典中少量原子的线性组合。这些原子可以看作是数据的......
  • 《构建之法》阅读笔记二
    深入探索团队协作与软件项目管理再次研读《构建之法》,团队协作与软件项目管理的内容让我感触颇深。软件开发中,团队协作至关重要,直接影响项目成败。书中指出,团队成员间的沟通与协作是项目推进的关键。不同角色成员,如开发人员、测试人员、产品经理等,只有紧密配合,才能保证项目顺利......