webSocket实时通信02——基于Spring【纯后端——JAVA】

news/2024/11/23 2:29:12/

这里是基于Spring整合websoket后来实现的实时通信,这里只有java的代码,通过在线网站 http://www.websocket-test.com/测试即可

1. 导包

	<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.8.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.1.6.RELEASE</version></dependency>

2. 拦截器

public class MyHandshakeInterceptor implements HandshakeInterceptor {/*** 握手前 可进行业务逻辑处理 例如用户校验啥的* @param serverHttpRequest* @param serverHttpResponse* @param webSocketHandler* @param map* @return* @throws Exception*/@Overridepublic boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {return true;}/*** 握手后* @param serverHttpRequest* @param serverHttpResponse* @param webSocketHandler* @param e*/@Overridepublic void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {}
}

3. 处理器

可以用set来存储客户端对象,也可以用map来存储,具体根据实际场景来就行,在onOpen()等几个方法中,具体的代码根据自己的业务逻辑来实现即可。

public class MyWebSocketHandler implements WebSocketHandler {/*** 用来存储每一个客户端对象对应的WebSocketSession对象*/private static final Set<WebSocketSession> users = new CopyOnWriteArraySet<>();/*** 链接成功之后的处理*/@Overridepublic void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {users.add(webSocketSession);System.out.println(webSocketSession.hashCode() + "建立连接成功");}/*** 服务器接收到消息的处理* @param webSocketSession* @param webSocketMessage* @throws Exception*/@Overridepublic void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {try {webSocketSession.sendMessage(new TextMessage("接收到消息:" + webSocketMessage.getPayload()));} catch (Exception e) {e.printStackTrace();}}/*** 推送消息给所有人* @param text*/public static void sendMsgToAll(String text) {for (WebSocketSession session : users) {try {session.sendMessage(new TextMessage(text));} catch (Exception e) {e.printStackTrace();}}}/*** 连接异常的处理* @param webSocketSession* @param throwable* @throws Exception*/@Overridepublic void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception {System.out.println(webSocketSession.hashCode() + "连接异常");throwable.printStackTrace();}/*** 连接关闭时的处理* @param webSocketSession* @param closeStatus* @throws Exception*/@Overridepublic void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {users.remove(webSocketSession);System.out.println(webSocketSession.hashCode() + "连接关闭");}/*** 是否支持分片消息* @return*/@Overridepublic boolean supportsPartialMessages() {return false;}
}

4. 配置类

这里用一个接口来推送消息给所有连接到服务器的客户端

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {/*** 配置服务器的ws地址 跨域校验* @param webSocketHandlerRegistry*/@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {webSocketHandlerRegistry.addHandler(myWebSocketHandler(), "/webSocketBySpring").addInterceptors(new MyHandshakeInterceptor()).setAllowedOrigins("*");webSocketHandlerRegistry.addHandler(myWebSocketHandler(), "/sockjs/webSocketBySpring").addInterceptors(new MyHandshakeInterceptor()).setAllowedOrigins("*").withSockJS();}@Beanpublic WebSocketHandler myWebSocketHandler() {return new MyWebSocketHandler();}
}

5. 控制器

@RestController
public class MsgController2 {@GetMapping("/sendMsg")public void sendMsg(@RequestParam(value = "text") String text) {MyWebSocketHandler.sendMsgToAll(text);}
}

6. 启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class WebSocketApplication {public static void main(String[] args) {SpringApplication.run(WebSocketApplication.class,args);}
}

7. 测试

  1. 使用不同的浏览器访问http://www.websocket-test.com/
    进入到网页后会自动连接到网站系统的websocket服务器,这需要我们先断开连接,将地址填成我们的地址
    在这里插入图片描述
    链接成功调用afterConnectionEstablished()
    在这里插入图片描述

  2. 通过定义的接口推送消息
    直接通过浏览器调用本地地址http://192.168.16.144:8800/sendMsg?text=你是来拉屎的吗
    在这里插入图片描述


http://www.ppmy.cn/news/403376.html

相关文章

苹果无线笔记本怎么连不上win服务器,老司机还原苹果笔记本电脑连接不上wifi该的办法?...

老司机还原苹果笔记本电脑连接不上wifi该的办法? 使用Mac苹果电脑过程中偶尔碰到wiFi无法连接的问题&#xff0c;这是怎样回事&#xff1f;经过检查发现是与路由器模式设置有关&#xff0c;原因大多因为路由器的协议与苹果电脑不一致导致的。熟悉问题原因了&#xff0c;可尝试…

手机连上WIFI,再利用蓝牙使笔记本电脑共享此WIFI

&#xfeff;&#xfeff; 共享网络&#xff0c;这次用手机蓝牙 2014-4-28 9:43:35类型&#xff1a;原创来源&#xff1a;电脑报报纸编辑&#xff1a;杨璐作者&#xff1a;杜立明 【电脑报在线】现在很多安卓4.0版本以后的手机都有了蓝牙共享网络功能&#xff0c;但是知道的用户…

解决mac连接不上星巴克wifi的问题

在星巴克写我的第一篇博客&#xff0c;结果mbp连wifi的时候遇到无法跳转到星巴克wifi页的问题&#xff0c;搞了一会儿发现一个好办法。。。正好试写一下来练个手&#xff5e; 问题描述 wifi显示连接&#xff0c;chrome浏览器随便打开一个网页却无法跳转&#xff0c;并显示未连…

ACK打击是什么意思?ACK打击怎么防御?

ACK Flood打击是TCP连接建立之后&#xff0c;所有传输的TCP报文都是带有ACK标志位的数据包。 接收端在收到一个带有ACK标志位的数据包的时候&#xff0c;需要检查该数据包所表示的连接四元组是否存在&#xff0c;如果存在则检查该数据包所表示的状态是否合法&#xff0c;然后再…

快速开发框架:一招解锁企业流程化管理!

在流程化管理时代&#xff0c;什么样的平台可以帮助企业实现高效率发展&#xff1f;在信息化爆炸式发展的今天&#xff0c;有很多企业期望能通过专用的快速开发框架实现提质增效发展。目前&#xff0c;低代码技术平台是较为盛行的平台&#xff0c;拥有易操作、灵活、增效等优势…

ffmpeg capture decklink

确保decklink设备已经接入 lspci | grep Blackm02:00.0 Multimedia video controller: Blackmagic Design DeckLink SDI Micro 确保decklink驱动已经正确安装 lsmod | grep blackmagicblackmagic_io 2068480 2 确保ffmpeg已经启用decklink&#xff0c;如何配置之前的博文已经…

复习css样式的第1章

什么是 CSS&#xff1f; CSS 指的是层叠样式表* (Cascading Style Sheets)CSS 描述了如何在屏幕、纸张或其他媒体上显示 HTML 元素CSS 节省了大量工作。它可以同时控制多张网页的布局外部样式表存储在 CSS 文件中 三种使用 CSS 的方法 有三种插入样式表的方法&#xff1a; 外…

『论文精读』Vision Transformer(VIT)论文解读

『论文精读』Vision Transformer(VIT)论文解读 文章目录 一. 简介二. 模型架构2.1. 关于image presentation2.2. 关于positional encoding2.3. 关于CNNTransformer2.4. 关于输入图片大小 三. 实验部分3.1. 数据集3.2. 模型及变体3.3. 实验结果3.4. 模型可视化 参考文献 论文下…