Spring Boot 整合单机websocket(附github源码)
websocket 概念
websocket 是一个通信协议,通过单个 TCP 连接提供全双工通信。websocket 连接成功后,服务端和客户可以进行双向通信。不同于 http 通信协议需要每次由客户端发起,服务响应到客户端。
websocket 相对轮询也能节约带宽,并且能实时的进行通信。
整合步骤
1. 添加 maven 依赖
<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>
	<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
        <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-freemarker</artifactId>
	<version>2.1.3.RELEASE</version>
</dependency>
添加web、websocket和freemarker依赖。
2. 使用 ServerEndpointExporter 创建 bean
这个 bean 会自动注册声明 @ServerEndpoint 注解声明的 websocket endpoint,使用springboot自带tomcat启动需要该配置,使用独立 tomcat 则不需要该配置。
@Configuration
public class WebSocketConfig {
    //tomcat启动无需该配置
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
3. 创建服务端端点 (ServerEndpoint)
@Component
@ServerEndpoint(value = "/message")
@Slf4j
public class WebSocket {
	private static Map<String, WebSocket> webSocketSet = new ConcurrentHashMap<>();
	private Session session;
	@OnOpen
	public void onOpen(Session session) throws SocketException {
		this.session = session;
		webSocketSet.put(this.session.getId(),this);
		log.info("【websocket】有新的连接,总数:{}",webSocketSet.size());
	}
	@OnClose
	public void onClose(){
		String id = this.session.getId();
		if (id != null){
			webSocketSet.remove(id);
			log.info("【websocket】连接断开:总数:{}",webSocketSet.size());
		}
	}
	@OnMessage
	public void onMessage(String message){
		if (!message.equals("ping")){
			log.info("【wesocket】收到客户端发送的消息,message={}",message);
			sendMessage(message);
		}
	}
	/**
	 * 发送消息
	 * @param message
	 * @return 全部都发送一遍
	 */
	public void sendMessage(String message){
		for (WebSocket webSocket : webSocketSet.values()) {
			webSocket.session.getAsyncRemote().sendText(message);
		}
		log.info("【wesocket】广播消息,message={}", message);
	}
}
4. 添加 controller 和 客户端
- 添加 controller
 
@GetMapping({"","index.html"})
public ModelAndView index() {
	ModelAndView view = new ModelAndView("index");
	return view;
}
- 添加ftl页面
 
<!DOCTYPE html>
<html>
<head>
    <title>websocket</title>
</head>
<body>
<div>
    <input type="text" name="message" id="message">
    <button id="sendBtn">发送</button>
</div>
<div style="width:100px;height: 500px;" id="content">
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<script type="text/javascript">
    var ws = new WebSocket("ws://127.0.0.1:8080/message");
    ws.onopen = function(evt) {
        console.log("Connection open ...");
    };
    ws.onmessage = function(evt) {
        console.log( "Received Message: " + evt.data);
        var p = $("<p>"+evt.data+"</p>")
        $("#content").prepend(p);
        $("#message").val("");
    };
    ws.onclose = function(evt) {
        console.log("Connection closed.");
    };
    $("#sendBtn").click(function(){
        var aa = $("#message").val();
        ws.send(aa);
    })
</script>
</body>
</html>
5. 展示效果

附录
Spring Boot 整合单机websocket(附github源码)的更多相关文章
- Spring Boot核心技术之Rest映射以及源码的分析
		
Spring Boot核心技术之Rest映射以及源码的分析 该博客主要是Rest映射以及源码的分析,主要是思路的学习.SpringBoot版本:2.4.9 环境的搭建 主要分两部分: Index.ht ...
 - Springboot 整合通用mapper和pagehelper展示分页数据(附github源码)
		
简介 springboot 设计目的就是为了加速开发,减少xml的配置.如果你不想写配置文件只需要在配置文件添加相对应的配置就能快速的启动的程序. 通用mapp 通用mapper只支持对单表的操作,对 ...
 - 基于struts2的学生报道管理系统(附github源码地址)
		
本项目参考了<java web轻量级开发全体验>,加入了对mysql的支持. 一.基本业务功能 通过struts2框架,结合mysql数据库构建一个学生报到管理系统,来模拟学生报到登记的过 ...
 - 【JAVA-JDT-AST】Java抽象语法树的构建、遍历及转成dot格式(附Github源码)
		
Background: 最近为了重现tree-based clone detection的论文:L. Jiang, G. Misherghi, Z. Su, and S. Glondu. Deckar ...
 - Cesium数据可视化-仓储调度系统可视化部分(附github源码)
		
Cesium数据可视化-仓储调度系统可视化部分 目的 仓储调度系统需要一个可视化展示物资运输实况的界面,需要配合GPS设备发送的位置信息,实时绘制物资运输情况和仓储仓库.因此,使用Cesium可视化该 ...
 - Angular + Leaflet 实现房源数据可视化(附github源码)
		
这是什么?租房信息展示平台 宏观的租房数据可视化微观的房源信息展示多条件搜索等等 链接地图搜租房 来龙去脉 受 @李国宝 的地图搜租房启发,利用其提供的开放API,配合自己在前端和地理信息系统方面的 ...
 - spring boot 整合 elasticsearch  5.x
		
spring boot与elasticsearch集成有两种方式.一种是直接使用elasticsearch.一种是使用data中间件. 本文只指针使用maven集成elasticsearch 5.x, ...
 - Spring Boot整合ElasticSearch和Mysql 附案例源码
		
导读 前二天,写了一篇ElasticSearch7.8.1从入门到精通的(点我直达),但是还没有整合到SpringBoot中,下面演示将ElasticSearch和mysql整合到Spring Boo ...
 - Spring Boot系列(三):Spring Boot整合Mybatis源码解析
		
一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...
 
随机推荐
- SpringCloud升级之路2020.0.x版-24.测试Spring Cloud LoadBalancer
			
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 通过单元测试,我们 ...
 - kubebuilder实战之六:构建部署运行
			
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
 - Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务
			
前面文章已经演示过,将我们的示例微服务程序DaprTest1部署到k8s上并运行.当时用的k8s是Docker for desktop 自带的k8s,只要在Docker for deskto ...
 - Spring笔记(4)
			
集成Web环境 1.步骤 导入Spring-web坐标 <!-- spring-web--> <dependency> <groupId>org.springfra ...
 - 紫色飞猪的研发之旅--06go自定义状态码
			
在实际开发中,需要前后端需要协商状态码,状态码用于后端返前端时使用.在一个团队中,定义的状态码讲道理应该是一致的,项目开始的起始阶段状态码应该是定义了个七七八八的,随着功能的叠加而不断增加.此系列将围 ...
 - JDK1.8源码(五)——java.util.Vector类
			
JDK1.8源码(五)--java.lang. https://www.cnblogs.com/IT-CPC/p/10897559.html
 - docker的网络基础
			
docker使用的与Linux网络有关的主要技术: Network Namespace Veth 设备对 Iptables/Netfilter 网桥 路由 <1> 网络命令空间 names ...
 - iframe 内容适用高度
			
HTML: <div class="content"> <iframe id="frameObj" src="链接" fr ...
 - 任由文字肆意流淌,更自由的开源 Markdown 编辑器
			
对于创作平台来说内容编辑器是十分重要的功能,强大的编辑器可以让创作者专注于创作"笔"下生花.而最好取悦程序员创作者的方法之一就是支持 Markdown 写作,因为大多数程序员都是用 ...
 - .net Core 基于EF Core 实现数据库上下文
			
在做项目时,需要将某一些功能的实体建立在另一个数据库中,连接不同的数据库用以存储记录.通过查找资料,实现EF Core上下文. 下面是实现上下文后的解决方案的目录: 1.UpAndDownDbCont ...