Spring Boot 整合单机websocket的步骤 附github源码

 更新时间:2021年10月08日 11:14:49   作者:jeremylai  
websocket 是一个通信协议,通过单个 TCP 连接提供全双工通信,这篇文章主要介绍了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. 展示效果

附录

github源码

到此这篇关于Spring Boot 整合单机websocket 附github源码的文章就介绍到这了,更多相关Spring Boot 整合websocket内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Spring的统一功能处理(拦截器)实现

    关于Spring的统一功能处理(拦截器)实现

    这篇文章主要介绍了关于Spring的统一功能处理(拦截器)实现,每个方法中都要单独写用户登录验证的方法,即使封装成公共方法,也一样要传参调用和在方法中进行判断,需要的朋友可以参考下
    2023-05-05
  • JDBC中Statement的Sql注入问题详解

    JDBC中Statement的Sql注入问题详解

    这篇文章主要介绍了JDBC中Statement的Sql注入问题详解,sql注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些输入大都是sql语法里的一些组合,通过执行sql语句进而执行攻击者所要做的操作,需要的朋友可以参考下
    2023-10-10
  • MyBatis-plus报错Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required的解决方法

    MyBatis-plus报错Property ‘sqlSessionFactory‘ or 

    这篇文章主要给大家介绍了MyBatis-plus 报错 Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required的两种解决方法,如果遇到相同问题的朋友可以参考借鉴一下
    2023-12-12
  • java反编译工具Bytecode-Viewer分享

    java反编译工具Bytecode-Viewer分享

    这篇文章主要介绍了java反编译工具Bytecode-Viewer分享,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 解析Mybatis连续传递多个参数的方法

    解析Mybatis连续传递多个参数的方法

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架,这篇文章主要介绍了Mybatis连续传递多个参数的方法,需要的朋友可以参考下
    2016-08-08
  • springboot 配置DRUID数据源的方法实例分析

    springboot 配置DRUID数据源的方法实例分析

    这篇文章主要介绍了springboot 配置DRUID数据源的方法,结合实例形式分析了springboot 配置阿里DRUID数据源的具体步骤与相关操作技巧,需要的朋友可以参考下
    2019-12-12
  • Java @Autowired报错原因分析和4种解决方案

    Java @Autowired报错原因分析和4种解决方案

    这篇文章主要介绍了Java @Autowired报错原因分析和4种解决方案,文章围绕主题展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考以一下
    2022-05-05
  • Spring boot + LayIM + t-io 实现文件上传、 监听用户状态的实例代码

    Spring boot + LayIM + t-io 实现文件上传、 监听用户状态的实例代码

    这篇文章主要介绍了Spring boot + LayIM + t-io 实现文件上传、 监听用户状态的实例代码,需要的朋友可以参考下
    2017-12-12
  • MybatisPlus:使用SQL保留字(关键字)的操作

    MybatisPlus:使用SQL保留字(关键字)的操作

    这篇文章主要介绍了MybatisPlus:使用SQL保留字(关键字)的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • springcloud如何使用Feign后台内部传递MultipartFile

    springcloud如何使用Feign后台内部传递MultipartFile

    这篇文章主要介绍了springcloud如何使用Feign后台内部传递MultipartFile,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论