53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面

这篇具有很好参考价值的文章主要介绍了53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于注解开发 WebSocket

–注解就是: @OnOpen、 @OnClose 、 @OnMessage 、@OnError这些

★ WebSocket的两种开发方式

▲ Spring Boot为WebSocket提供了两种开发方式:

  • 基于spring-boot-starter-websocket.jar开发WebSocket

  • 基于Spring WebFlux开发WebSocket

两种方式对比:
springboot API
53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面,springboot,spring boot,WebSocket

Socket:套接字。
插座。
在通信的两端分别建立虚拟的Socket(插座),网络协议就会负责在两个Socket之间建立虚拟线路。然后通信的两端即可通过该虚拟线路进行实时的、可靠的通信。

WebSocket 就是在服务器与客户端浏览器之间的建立双向通信的Socket。从而保证服务器与客户端浏览器之间可进行实时的双向通信。

▲ 传统Web应用: 请求 - 响应。 这种模型没办法让服务器主动将数据推送客户端的浏览器。 还有比如SSE(服务器事件机制)

★ 基于Spring Boot自动配置来开发WebSocket

两步:

(1)定义一个WebSocket处理类
该处理类有两种开发方式(历史原因造成):

第一种方式:   - 直接使用JDK提供的 WebSocket注解 修饰处理方法,
                并使用 @ServerEndpoint  注解修饰该处理类即可。
                WebSocket注解就是: @OnOpen、 @OnClose 、 @OnMessage 、@OnError这些
  ——这种方式下方法签名可以随便写,方法参数也可以自行定义,非常灵活。
  官方也推荐尽量使用第一种方式

第二种方式:    - 实现WebSocketHandler接口、并实现该接口中定义的各种处理方法。
  ——Java语法规定,实现接口时,实现的方法必须与接口中定义的方法有相同的方法签名。
  ——这种方式就不够灵活。
(2)配置或导出WebSocket处理类
如果采用注解方式开发WebSocket处理类,
这一步只需要在 Spring容器 中配置一个ServerEndpointExporter Bean  (导出器)即可。
该导出器会负责将容器中所有的@ServerEndpoint注解修饰的处理Bean都导出成WebSocket。
因此无论程序有多少个WebSocket处理Bean,导出器Bean只要配置一个即可。
——非常简单、方便。

如果采用是实现接口的方式开发WebSocket处理类,
这一步就需要使用WebSocketConfigurer来配置WebSocket。

代码演示

创建项目
53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面,springboot,spring boot,WebSocket

开发websocket的两步。
53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面,springboot,spring boot,WebSocket

注解:@PathParam()

属于 WebSocket 的,用于获取路径上的参数。
53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面,springboot,spring boot,WebSocket

发送消息的简单解释:
53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面,springboot,spring boot,WebSocket

完整代码:

前端页面
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title> 基于WebSocket的多人聊天 </title>
	<script type="text/javascript">
		// 定义Web Socket对象
		var webSocket = null;
		let sendMsg = function()
		{
			if (webSocket == null || webSocket.readyState != 1)
			{
				document.getElementById('show').innerHTML
					+= "还未连接服务器,请先连接WebSocket服务器<br>";
				return;
			}
			let inputElement = document.getElementById('msg');
			// 发送消息
			webSocket.send(inputElement.value);
			// 清空单行文本框
			inputElement.value = "";
		}
		let connect = function()
		{
			let name = document.getElementById('name').value.trim();
			if (name == null || name == "")
			{
				document.getElementById('show').innerHTML
					+= "用户名不能为空<br>";
				return;
			}
			if (webSocket && webSocket.readyState == 1)
			{
				webSocket.close();
			}
			webSocket = new WebSocket("ws://127.0.0.1:8080/websocket/" + name);
			webSocket.onopen = function()
			{
				document.getElementById('show').innerHTML
					+= "恭喜您,连接服务器成功!<br>";
				document.getElementById('name').value = "";
				// 为onmessage事件绑定监听器,接收消息
				webSocket.onmessage= function(event)
				{
					// 接收、并显示消息
					document.getElementById('show').innerHTML
						+= event.data + "<br>";
				}
			};
		}
	</script>
</head>
<body>
<input type="text" size="20" id="name" name="name"/>
<input type="button" value="连接" onclick="connect();"/>
<div style="width:600px;height:240px;
	overflow-y:auto;border:1px solid #333;" id="show"></div>
<input type="text" size="80" id="msg" name="msg"/>
<input type="button" value="发送" onclick="sendMsg();"/>
</body>
</html>
MyWebSocketHandler 注解开发各方法
package cn.ljh.app.websocket;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


//基于注解开发 WebSocket --注解就是: @OnOpen、 @OnClose 、 @OnMessage 、@OnError这些

@Component
//这个注解需要指定指定映射地址
@ServerEndpoint("/websocket/{name}")
@Slf4j
public class MyWebSocketHandler
{
    //可以用注解来修饰不同的处理方法

    //假设是一个聊天室,map 中的key 是每个用户的 Session , value 是用户的name
    //创建一个线程安全的map ,用这个map来保存各用户的Session与name之间的对应关系
    public final static Map<Session,String> myClients = new ConcurrentHashMap<>();

    //当浏览器 与 Websocket 服务器建立连接的时候触发该方法
    //这个Session参数代表浏览器 与 WebSocket 服务器所建立连接会话,它用于通信。
    //这个 @PathParam() 相当于spring mvc 中的 @PathVariable,
    //都是用来获取路径中的参数--获取这个路径"/websocket/{name}" 中的name参数

    @OnOpen
    public void onOpen(Session session , @PathParam("name") String name)
    {
        //当用户登录的时候,把信息存进去
        myClients.put(session,name);
        log.debug("--------- onOpen ----------");
    }

    //当浏览器与WebSocket服务器 关闭的时候触发该方法
    @OnClose
    public void onClose(Session session)
    {
        //当连接关闭的时候,就将该客户端从map中删除
        myClients.remove(session);
        log.debug("--------- onClose ----------");
    }


    //当 WebSocket服务器 收到 浏览器 发送过来的消息时触发该方法
    @SneakyThrows
    @OnMessage
    public String onMessage(Session session, String message)
    {
        //收到消息,把消息广播给每个客户端      keySet()-->将map中的所有key存到set集合中
        for (Session client : myClients.keySet())
        {
            //此处的 client 就代表每个客户端
            //向client 发送信息,这个 client 代表了一个浏览器
            //getBasicRemote() 表示给客户端发送消息是同步的、阻塞的    ,   sendText()  发送消息
            client.getBasicRemote().sendText(myClients.get(session)+" 说:"+message);

        }
        log.debug("--------- onMessage ----------"+message);
        return null;
    }

    //但 WebSocket 服务器 与 浏览器通信出现异常时触发该方法
    //这个 Throwable 参数就代表了出现的异常
    @OnError
    public void onError(Session session, Throwable ex)
    {
        //当连接出现异常的时候,将该客户端从 Map 中栅除
        myClients.remove(session);
        log.debug("--------- onError ----------");
    }


}
MyWebSocketConfig 配置 WebSocket 导出器
package cn.ljh.app.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * author JH
 * date 2023/9/7  0007 12:28
 */

@Configuration
public class MyWebSocketConfig
{
    /*
     *配置 WebSocket 导出器
     *
     *   该导出器会负责将容器中所有的 @ServerEndpoint 注解修饰的 处理Bean 都导出成 WebSocket。
     *  因此无论程序有多少个 WebSocket 处理Bean,导出器Bean 只要配置一个即可。
     */

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

application.yml 配置日志级别
#给这个包设置日志级别为debug
logging:
  level:
    cn:
      ljh:
        app:
          websocket: debug

测试:

进行websocket连接
53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面,springboot,spring boot,WebSocket

成功基于注解开发WebSocket 的多人聊天室
53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面,springboot,spring boot,WebSocket文章来源地址https://www.toymoban.com/news/detail-700802.html

到了这里,关于53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot整合WebSocket的两种方式及微服务网关Gateway配置

    项目中后台微服务需要向前端页面推送消息,因此不可避免的需要用到WebSocket技术。SpringBoot已经为WebSocket的集成提供了很多支持,只是WebSocket消息如何通过微服务网关Spring Cloud Gateway向外暴露接口,实际开发过程中遇到了很多问题。微服务框架本身是作为一个平台为各种服务

    2024年02月03日
    浏览(46)
  • Spark有两种常见的提交方式:client 模式和 cluster 模式对机器 CPU 的影响

    ,请参考以下说明 Client 模式: 在 Client 模式下,Spark Driver 运行在提交任务的客户端节点上(即运行 spark-submit 命令的机器)。Driver 负责执行应用程序的调度和监控,而 Executor 则在集群的工作节点上启动和运行任务。 在 Client 模式中,机器的 CPU 负担主要集中在 Driver 进程上

    2024年02月10日
    浏览(33)
  • 基于注解切换、Hikari实现的SpringBoot动态数据源(支持JNDI)

    先说效果,要实现方法级别注解切换当前数据源,不设置注解时走默认数据源,同时支持JNDI源。 Spring框架中存在一个抽象类 AbstractRoutingDataSource ,他是一个可以动态选择当前DataSource的路由类,我们就是要从这里入手,重新实现数据源的切换选择逻辑。然后借助注解和切面,

    2024年02月08日
    浏览(79)
  • Midjourney 动画全参数提示(为 Niji V5 更新)使用 Midjourney 生成动画有两种方式:使用 Niji 模式或使用标准 Midjourney 模型,参数教程(第一节)

    Niji V5(Niji 模式的最新版本)是 Midjourney 的专门针对动画的模型。它建立在与标准 Midjourney 模型完全不同的架构上,更擅长生成具名动画角色。Niji V4 于 2023 年 12 月发布,Niji V5 于 2023 年 4 月 1 日发布。 Midjourney 的 V5 模型于 2023 年 3 月发布。图像质量令人难以置信,比之前的

    2024年02月10日
    浏览(49)
  • 基于Docker和Springboot两种方式安装与部署Camunda流程引擎

    Camunda 相对于其他流程引擎的优势在于开源性、 BPMN 2.0 支持、可扩展性、轻量级和高性能,以及可观察性。并且 Camunda 支持独立平台的方式部署流程引擎,这更有利于分布式的项目。本文以 7.18.0 版本为例,介绍了: Docker Spring Boot 两种安装和部署 Camunda 流程引擎的方式。 D

    2024年03月16日
    浏览(45)
  • 本地jar包导入maven有两种方法

    本地jar包导入maven有两种方法 第一种,安装该jar包到maven的本地仓库中,主要用到maven的命令: 在cdm命令窗口下执行2中命令,直到出现bulid success 或者直接将jar移到 .m2文件夹里 在对应的.m2文件夹下可以找到该jar文件 在.pom文件中引用 这种方法只适合在本地代码调试,放到线上

    2024年02月13日
    浏览(51)
  • selenium两种代理方式(方式二支持账号密码验证)

    https://registry.npmmirror.com/binary.html?path=chromedriver/ 以下方式均实机测试过。 方式一 无需验证,只需填写代理IP和端口号 方式二 通过生成插件并加载通过代理验证,需要填写代理IP、端口号、验证账号和密码,该方式缺点是不支持后台静默运行(headless)

    2024年02月11日
    浏览(46)
  • 微信小程序分享功能的实现方法有两种

    官方设定5:4 小程序分享尺寸太大,尺寸500px 400px(宽 高) 在page.js中实现onShareAppMessage,便可在小程序右上角选择分享该页面 自定义按钮实现分享,在page中添加一个带有open-type=\\\'share’的button标签()。点击该按钮后,即会自动触发已经在page.js中定义好的onShareAppMessage方法,实现分享

    2024年02月11日
    浏览(52)
  • js 判断两个字符串是否相等(有两种方法)

    使用比较运算符判断两个字符串是否相等 可以使用比较运算符 === 或 == 来判断两个字符串是否相等。例如: 在上述代码中,我们定义了两个字符串变量 str1 和 str2 ,并使用 === 运算符来比较它们的值。如果两个字符串相等,则输出 两个字符串相等 ;否则输出 两个字符串不相

    2024年02月05日
    浏览(79)
  • 怎么判断数组为空? 数组为空可能有两种情况

    情况一:数组的引用为null,若输出数组的长度,会报空指针异常 情况二:数组的长度为0,若输出数组的长度,会输出0 综上 : 判断数组为空需要判断两种情况 例如 数组名字为 nums 则判断数组为空需要以下语句 if(nums == null || nums.length == 0)

    2024年02月11日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包