首页 > 其他分享 >172.Spring Boot WebSocket:编码分析

172.Spring Boot WebSocket:编码分析

时间:2023-06-26 17:35:30浏览次数:39  
标签:websocket Spring Boot 消息 WebSocket 连接 服务端 客户端


前言:

       在上一篇文章中讲到了WebSocket的原理,这节中我们先简单的编码分析下,这样有助于在之后的实战编码。

说明:

(1)编码中使用的Spring Boot版本是: 1.5.8;

(2) 使用WebSocket有两种方式: 第一种方式使用socketJS, 第二种方式是使用H5的标准。实例中使用的是第二种方式;

(3)最后提供源代码;

 

 

编码分析:

       在例子中,我们需要编写两端的代码:服务端和客户端(当然代码都在一个工程里)。

(1)Client:客户端说明

       客户端的代码主要是使用H5的WebSocket进行实现,在前端网页中使用WebSocket进行连接服务端,然后建立Socket连接进行通讯。

(2)Server:服务端说明

       服务端主要是建立多个客户端的关系,进行消息的中转等。客户端成功连接到服务端之后,就可以通过建立的通道进行发送消息到服务端,服务端接收到消息之后在群发给所有的客户端。

(3)客户端和服务端怎么连接?

       客户端通过JS中的WebSocket对象进行连接到服务端:

var websocket = new WebSocket("ws://localhost:8080/websocket");




/websocket端点呢,使用注解@ServerEndpoint即可:

@ServerEndpoint(value = "/websocket")




    当客服端有连接请求了,服务端怎么接收请求,使用注解@OnOpen即可:

@OnOpen  
public void onOpen(Session session) {  
        this.session = session;  
 }





(4)客户端和服务端怎么发送消息?

       客户端可以使用webSocket提供的send()方法,如下代码:

//获取输入的文本信息进行发送

var message = document.getElementById('text').value;  
websocket.send(message);




    服务端怎么发送消息呢?主要是使用在成功建立连接的时候,创建的Session对象进行发送,如下代码:



session.getAsyncRemote().sendText("恭喜您成功连接上WebSocket");




(5)客户端和服务端怎么接收消息?

       客户端接收消息消息使用的是websocket的onmessage回调方法,如下代码:

websocket.onmessage = function(event) {  
           //文本信息直接显示,如果是json信息,需要转换下在显示.  
       var data = event.data;  
       document.getElementById('message').innerHTML += data;  
}




       服务端怎么接收到消息,使用注解@OnMessage,如下代码:

@OnMessage  
public void onMessage(String message, Session session) {  
        System.out.println("来自客户端的消息:" + message);  
}



(6)客户端和服务端关闭连接处理?

       客户端使用websocket.close()进行关闭连接;

       服务端使用@OnClose注解监听客户端的关闭动作。

 

(7)客户端和服务端异常处理?

       客户端当有异常信息的时候会回调方法:websocket.onerror;

       服务端使用@OnError注解监听异常信息。

 

(8)群聊原理(群发消息)

       服务端在和客户端建立连接的时候,会创建一个webSocket对象,我们会将每个连接创建的对象进行报错到一个列表中,比如:CopyOnWriteArraySet(这是线程安全的);在要进行群发的时候,编写我们的列表对象进行群发消息。

 

(9)单聊原理(一对一消息)

       单聊的时候,就无需遍历列表,而是需要知道发送者和接受者各自的Session对象,这个Session对象怎么获取呢?Session可以获取到sessionId,发送者在发送消息的时候,携带接收消息的sessionId,那么问题就演变成了:发送者怎么知道接受者的sessionId,那就是加入一个在线用户列表即可,在线用户列表中有用户的基本信息,包括sessionId。

       明白了这些,在接下里的编码中就会轻松很多。

 







标签:websocket,Spring,Boot,消息,WebSocket,连接,服务端,客户端
From: https://blog.51cto.com/u_11142439/6556183

相关文章

  • 174. Spring Boot WebSocket:群聊-昵称
     需求缘起:       在上一篇文章已经可以群聊功能了,但是存在一个问题,就是无法显示消息是谁发送了,这样就会导致消息乱七八糟的无法解读。在这版文章中解决昵称显示的问题。效果展示: 悟空消息:   师傅消息:   八戒消息: (1)在连接的时候,让用户输入昵称  ......
  • springboot 跨域设置
      写文章 SpringBoot项目解决跨域的几种方案小满只想睡觉一直快乐!​关注她  在用SpringBoot开发后端服务时,我们一般是提供接口给前端使用,但前端通过浏览器调我们接口时,浏览器会有个同源策略的限制,即协议,域名,端口任一不一样时都会......
  • 深度解析SpringBoot内嵌Web容器
    你好,我是刘牌!前言今天分享一个SpringBoot的内嵌Web容器,在SpringBoot还没有出现时,我们使用Java开发了Web项目,需要将其部署到Tomcat下面,需要配置很多xml文件,SpringBoot出现后,就从繁琐的xml文件中解脱出来了,SpringBoot将Web容器进行了内嵌,我们只需要将项目打成一个jar包,就可以运行......
  • Spring生命周期
    SpringBean的生命周期Spring框架中的组件被称为Bean,每个Bean都有其特定的生命周期。下面是SpringBean的生命周期的主要阶段:实例化:在这个阶段,Spring容器根据Bean定义创建Bean的实例。这可以通过构造函数或工厂方法来实现。属性注入:在实例化完成后,Spring容器将会为Bean的属......
  • Spring IoC有什么好处呢?
      来源   https://www.zhihu.com/question/23277575?utm_id=0   SpringIoC有什么好处呢? 作者:Mingqi链接:https://www.zhihu.com/question/23277575/answer/169698662来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。要了解控......
  • SpringCloud http大文件断点续传上传
    ​ 第一点:Java代码实现文件上传FormFilefile=manform.getFile();StringnewfileName= null;Stringnewpathname= null;StringfileAddre= "/numUp";try{    InputStreamstream=file.getInputStream();// 把文件读入    StringfilePath=request.......
  • spring系列框架有哪些
    springboot包含了springMVC,但后者需要手动配置很多东西才能跑起来,包括繁琐的xml配置,而springboot会自动配置,比如用注解简化了配置(不用配xml),没有手动也会有默认值 SpringBoot就是一个工具,他集成了SpringMVC。Web开发用的实际还是SpringMVC那一套SpringS......
  • SpringMVC http大文件断点续传上传
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • 肝了一周总结的SpringBoot常用注解大全,看完就炉火纯青了!
      来源于 https://www.macrozheng.com/mall/reference/springboot_annotation.html  肝了一周总结的SpringBoot常用注解大全,看完就炉火纯青了!   平时使用SpringBoot开发项目,少不了要使用到它的注解。这些注解让我们摆脱了繁琐的传统SpringXML配置,让我们开发项目......
  • Spring Boot - 异步任务
    SpringBoot-异步任务前言有时候,前端可能提交了一个耗时任务,如果后端接收到请求后,直接执行该耗时任务,那么前端需要等待很久一段时间才能接受到响应。如果该耗时任务是通过浏览器直接进行请求,那么浏览器页面会一直处于转圈等待状态。一个简单的例子如下所示:@RestController@R......