WebSocket(一):springboot集成webSocket

SpringBoot 集成 WebSocket SpringBoot 整合 websocket、websocket 的通信应用 阅读详情

1.引入pom文件

<!--web socket-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
   <groupId>javax</groupId>
   <artifactId>javaee-api</artifactId>
   <version>7.0</version>
   <scope>provided</scope>
</dependency>
<!--springBoot thymeleaf模板-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
   <version>1.5.1.RELEASE</version>
</dependency>

2.集成WebSocket

/**
 * @author tracyclock
 * @date 2018/10/18
 * 首先要注入ServerEndpointExporter,这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint。
 * 如果使用独立的servlet容器,而不是直接使用springboot的内置容器,就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理
 */
@Configuration
public class WebSocketConfig {

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

}

@Slf4j
@ServerEndpoint(value = "/webSocket" )
@Component
public class TracyWebSocket {

    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    /**
     * 连接建立成功调用的方法
     * 1.可通过@ServerEndpoint(value = "/webSocket/{key}" ) @PathParam("key") 传入必传值
     * 2.webSocket = new WebSocket("ws://localhost:9999/webSocket?key"); session.getQueryString() = key
     * key可以传入当期用户的唯一标识
     */
    @OnOpen
    public void onOpen(Session session) throws Exception{
        log.info("onOpen() queryString:{}",session.getQueryString());
        this.session = session;
        WebSocketMapUtil.put(session.getQueryString(),this);
        try {
            sendMessage("true" );
        } catch (IOException e) {
            log.info("onOpen() error:{}",e);
        }
    }

    /**
     * 连接关闭调用的方法
     * @throws Exception
     */
    @OnClose
    public void onClose() throws Exception{
        log.info("onClose()!!!");
        WebSocketMapUtil.remove(session.getQueryString());
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     * @throws IOException
     */
    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        log.info("onMessage!!!!!");
        /*try {
            TracyWebSocket myWebSocket= ((TracyWebSocket) WebSocketMapUtil.get(session.getQueryString().replace("service", "client")));
            if(myWebSocket != null){
                myWebSocket.sendMessage(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }*/
        System.out.println("来自客户端的消息:" + message);

        //群发消息
        /*for (TracyWebSocket item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }*/
    }

    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error){
        log.info("onError() error:{}",error);
    }


    /**
     * 发送消息方法
     */
    public void sendMessage(String message) throws IOException {
        log.info("sendMessage() message:{}",message);
        //this.session.getAsyncRemote().sendText(message);
        try {
            this.session.getBasicRemote().sendText(message);
        } catch (Exception e) {
            log.info("sendMessage() error:{}",e);
        }
    }

    /**
     * 群发消息方法
     */
    public void sendInfoAll(String message) throws IOException{
        log.info("sendInfoAll() start!");
        for(TracyWebSocket tracyWebSocket : WebSocketMapUtil.getValues()){
            tracyWebSocket.sendMessage(message);
        }
    }

    /**
     * 点对点,给客户端单发消息
     */
    public void sendInfoSingle(WsMessage wsMessage) throws IOException {
        log.info("sendInfoSingle() key:{} message:{}",wsMessage.getId(),wsMessage.getMessage());
        if(StringUtils.isNotBlank(wsMessage.getId())){
            TracyWebSocket tracyWebSocket = WebSocketMapUtil.get(wsMessage.getId());
            if(tracyWebSocket != null){
                try {
                    tracyWebSocket.sendMessage(wsMessage.getMessage().toString());
                } catch (IOException e) {
                    log.info("sendInfoSingle() error:{}",wsMessage.getId(),wsMessage.getMessage());
                }
            }
        }
    }

    /**
     * 对符合条件的客户端发送消息
     */
    public void sendInfoSet(Set<String> keySet, String message) throws IOException {
        log.info("sendInfoSet() key:{} message:{}",keySet,message);
        if(!CollectionUtils.isEmpty(keySet)){
            keySet.forEach(key -> {
                TracyWebSocket tracyWebSocket = WebSocketMapUtil.get(key);
                if(tracyWebSocket != null){
                    try {
                        tracyWebSocket.sendMessage(message);
                    } catch (IOException e) {
                        log.info("sendInfoSet() error:{}",e);
                    }
                }
            });
        }
    }
}
/**
 * @author tracyclock
 * 2018/09/04
 * 记录链接成功的用户
 */
public class WebSocketMapUtil {

    public static ConcurrentMap<String, TracyWebSocket> webSocketMap = new ConcurrentHashMap<>();

    public static void put(String key, TracyWebSocket tracyWebSocket){
        webSocketMap.put(key, tracyWebSocket);
    }

    public static TracyWebSocket get(String key){
        return webSocketMap.get(key);
    }

    public static void remove(String key){
        webSocketMap.remove(key);
    }

    public static Collection<TracyWebSocket> getValues(){
        return webSocketMap.values();
    }
}
/**
 * @author tracyclock
 * @date 2018/10/18
 * 自定义消息体
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WsMessage<T> implements Serializable{

    private static final long serialVersionUID = -3477023334141401126L;

    private T message;

    private String id;

}

3.编写html

webScoketA:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
Welcome<br/>
<input id="text" type="text" /><button onclick="send()">Send</button>    <button onclick="closeWebSocket()">Close</button>
<div id="message">
</div>
</body>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script type="text/javascript">
    var websocket = null;

    //判断当前浏览器是否支持WebSocket
    if('WebSocket' in window){
        websocket = new WebSocket("ws://127.0.0.1:5678/webSocket?a");
    }
    else{
        alert('Not support webSocket')
    }

    //连接发生错误的回调方法
    websocket.onerror = function(){
        setMessageInnerHTML("error");
    };

    //连接成功建立的回调方法
    websocket.onopen = function(event){
        setMessageInnerHTML("webSocket open");
    }

    //接收到消息的回调方法
    websocket.onmessage = function(event){
        setMessageInnerHTML(event.data);
    }

    //连接关闭的回调方法
    websocket.onclose = function(){
        setMessageInnerHTML("webSocket close");
    }

    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function(){
        websocket.close();
    }

    //将消息显示在网页上
    function setMessageInnerHTML(innerHTML){
        document.getElementById('message').innerHTML += "---------------"+innerHTML + '<br/>';
    }

    //关闭连接
    function closeWebSocket(){
        websocket.close();
    }

    //发送消息
    function send(){
        var message = document.getElementById('text').value;
        $.ajax({
            type: "POST",
            dataType: 'json',
            contentType: 'application/json;charset=utf-8',
            url: "http://127.0.0.1:5678/webSocket/send",
            data: JSON.stringify({
                "message": message.toString(),
                "id": "b"
            }),
            success: function (data){

            }
        })
        //websocket.send(message);
        document.getElementById('message').innerHTML += message + "-------------" + '<br/>';
    }
</script>
</html>

webScoketB:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
Welcome<br/>
<input id="text" type="text" /><button onclick="send()">Send</button>    <button onclick="closeWebSocket()">Close</button>
<div id="message">
</div>
</body>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script type="text/javascript">
    var websocket = null;

    //判断当前浏览器是否支持WebSocket
    if('WebSocket' in window){
        websocket = new WebSocket("ws://127.0.0.1:5678/webSocket?b");
    }
    else{
        alert('Not support websocket')
    }

    //连接发生错误的回调方法
    websocket.onerror = function(){
        setMessageInnerHTML("error");
    };

    //连接成功建立的回调方法
    websocket.onopen = function(event){
        setMessageInnerHTML("open");
    }

    //接收到消息的回调方法
    websocket.onmessage = function(event){
        setMessageInnerHTML(event.data);
    }

    //连接关闭的回调方法
    websocket.onclose = function(){
        setMessageInnerHTML("close");
    }

    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function(){
        websocket.close();
    }

    //将消息显示在网页上
    function setMessageInnerHTML(innerHTML){
        document.getElementById('message').innerHTML += "---------------"+innerHTML + '<br/>';
    }

    //关闭连接
    function closeWebSocket(){
        websocket.close();
    }

    //发送消息
    function send(){
        var message = document.getElementById('text').value;
        $.ajax({
            type: "POST",
            dataType: 'json',
            contentType: 'application/json;charset=utf-8',
            url: "http://127.0.0.1:5678/webSocket/send",
            data: JSON.stringify({
                "message": message.toString(),
                "id": "a"
            }),
            success: function (data){

            }
        })
        //websocket.send(message);
        document.getElementById('message').innerHTML += message + "-------------" + '<br/>';
    }
</script>
</html>

4.编写controller

@Slf4j
@Controller
@RequestMapping("/webSocket")
public class WebSocketController {

    @Autowired
    private TracyWebSocket tracyWebSocket;

    @RequestMapping(value = "/send",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ResponseBody
    public void send(@RequestBody WsMessage wsMessage) {
        log.info("send!!!!!!!!!!!!!!");
        try {
            tracyWebSocket.sendInfoSingle(wsMessage);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @RequestMapping("/test")
    public void test() {
        log.info("test!!!!!!!!!!!!!!");
    }

    @RequestMapping("/webSocketA")
    public String webSocketA() {
        log.info("go webSocketA");
        return "webSocketA";
    }

    @RequestMapping("/webSocketB")
    public String webSocketB() {
        log.info("go webSocketB");
        return "webSocketB";
    }
}

5.结果展示

 

6.简单的webSocket就成功了

第五章 PCIe介绍 5.1-5.7 为什么SSD要用PCIe接口?因为它快,比SATA快。通道,PCIe最多可以有32个通道。两个设备之间的PCIe连接,叫做一个Link。如下图,设备A和设备B是个双向连接,两个PCIe设备之间,有专门的发送和接收通道,数据可以同时往两个方向传输,PCIe Spec称这种工作模式为,可以理解为。和PCIe一样,SATA有独立的发送和接收通道。但与PCIe工作模式不一样,同一时间,SATA只有一条通道可以进行数据传输。这种工作模式称为。与SATA单通道不同,PCIe连接可以通过增加通道数扩展带宽。 阅读详情

相关推荐

BIOS硬件监控实战:如何手动读取IT8738芯片的温度与风扇数据(附代码)

本文深入探讨了如何绕过操作系统和HWMonitor等监控软件,直接通过寄存器级操作读取IT8738超级I/O芯片的硬件监控数据。文章提供了从动态定位EC空间、构建底层读写函数到解码传感器寄存器映射的完整实战指南,并附有C语言代码示例,帮助开发者理解BIOS硬件监控的底层原理,适用于定制硬件开发与故障诊断。

weixin_29192211的博客 109

websocket入门

服务端的编写 : 在项目的根目录下安装 nodejs-websocket (npm install nodejs-websocket) 代码编写 : var ws = require('nodejs-websocket'); var server = ws.createServer(function(conn){ console.log('new connection'); }...

天蝎 3881

数字IC后端时序违例修复:setup/hold冲突与时钟树优化实战

时序收敛是数字IC后端设计中最关键的环节之一,直接影响芯片能否在目标频率下稳定工作。建立时间与保持时间的本质是寄存器对数据稳定性的物理约束,而实际工程中,setup违例和hold违例往往此消彼长,冲突的根源在于数据路径与时钟路径的延迟匹配。时钟树综合(CTS)作为连接逻辑与物理的关键步骤,其skew、insertion delay和transition的优化直接决定了时序修复的成败。通过useful skew技术、合理的单元替换和路径结构调整,可以系统性地解决setup/hold冲突,实现时序收敛。本文结合

weixin_28292761的博客 220

WebSocket详解

很多可能对这个不太了解,一般接触比较多的都是HTTP请求,由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。这样我们的WebSocket就营运而生了。

weixin_55853065的博客 1443

2025虚幻游戏逆向工程解包尝试

2025虚幻游戏逆向工程解包指南 本文详细介绍了虚幻引擎5游戏逆向解包的完整流程,主要包括获取AES密钥、生成映射文件和导出资源三个关键步骤。作者在实际操作中遇到诸多难题:AES密钥获取工具存在加壳保护问题,映射文件生成器依赖复杂的VS编译环境,DLL注入工具的使用也存在技术门槛。通过多次尝试,作者发现部分游戏可直接搜索现成的AES密钥,而映射文件生成需要额外下载Memcury依赖库才能正常编译。文章提供了相关工具的下载链接和具体操作说明,但同时也指出每个环节都可能出现意外状况,逆向工程实际执行过程远比理论

wsdchong的博客 6149

【位运算进阶之----右移(>>)】

😄嘻嘻,朋友们,大家好!昨天我们学习了左移,今天我们来谈谈右移>>。⭐️简单来说,,也就是去掉一个数的二进制表达的末位,右移一位就去掉一位,右移两位就去掉两位。下面就让我们来详细看看吧!

weixin_73453526的博客 8931

WebSocket

WebSocket:也是一种协议,基于tcp协议,这里来和Http协议做一个对比 场景:http或https协议只能用来从前端发送请求给后端,而当服务端需要主动给前端发送消息时就没办法实现了,如:聊天系统;如果使用http协议就只能实现发送消息,而不能接收消息(因为接收消息需要服务端主动发送,这时候就需要用到WebSocket来进行通讯了) websocket协议:ws://或wss://(区别一下http/https) 方法:websocket协议有这么几个方法 1、创建WebSock

liucai1018的博客 2151

MATLAB配置MinGW编译器的完整指南

本文提供了在Windows系统上为MATLAB配置MinGW编译器的完整指南。详细介绍了通过MATLAB附加功能管理器在线安装和手动离线安装两种核心方法,并重点说明了如何解决常见的“未找到支持的编译器”等错误。指南包含从版本检查、环境变量配置到最终使用mex命令验证的每一步,帮助用户顺利完成MATLAB与MinGW的集成,以支持C/C++代码编译。

weixin_29031057的博客 264

WebSocket刨根问底(二)

上篇文章【WebSocket刨根问底(一)】中我们对WebSocket的一些基本理论进行了介绍,但是并没有过多的涉及到一些实战的内容,今天我希望能够用几个简单的案例来向小伙伴们展示下WebSocket的一些具体用法。 WebSocket API有哪些 首先有一点小伙伴们需要明确,那就是WebSocket并不总是用在浏览器和服务器的通信中,只要任意两个使用框架编写,支持WebSocket的应

江南一点雨的专栏 1万+

C#粘包和分包问题及解决方法

一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解:  下面对上面的图进行解释:  1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。  2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲...

weixin_42033401的博客 7767

Qt EGLFS 图形后端详解

EGLFS (EGL Full Screen) 是Qt框架在嵌入式Linux系统中的高性能图形显示后端,它提供了直接基于EGL和OpenGL ES的硬件加速渲染解决方案。

浩瀚之水的专栏 511

Web Socket

HTTP/1.0中大多实现为每个请求/响应交换使用新的连接 HTTP/1.1中一个连接可用一次或多次请求/响应交换 HTTP协议中,服务端不能主动联系客户端,只能由客户端发起 webSocket服务器和客户端均可主动发送数据 WebSocket对象提供了一组API,用于创建和管理WebSocket连接,以及通过连接发送的接收数据 WebSocket其实是一个新协议,根HTTP协议基...

xiaoxiede_wo的博客 729

学Simulink--人形机器人控制场景实例:基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真

matlab编辑% 连杆长度 (m)% 躯干(髋到CoM)% 大腿% 小腿% 质量 (kg)% 转动惯量(绕质心,简化为杆)matlab编辑% 躯干CoM(假设在髋上方L_body/2处)% 左大腿CoM% 左小腿CoM% (右腿类似,略)本文完成了基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真,实现了:✅ 定义7-DOF平面人形结构✅ 使用Symbolic Math Toolbox自动推导动力学方程✅ 生成。

amy_mhd的博客 397

SpringBoot集成WebSocket实战一

SpringBoot集成WebSocket实战一1.什么是WebSocket2.为什么要使用WebSocket3.SpringBoot整合WebSocket4. 服务器主动推送数据给前端 1.什么是WebSocket 什么是websocket,百度百科的解释是:"websocket是一种在单个TCP连接上进行全双工通讯的协议,websocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据,在websocket中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的

静幽水 4201

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

springboot集成websocket 实时输出日志到浏览器(一)

springboot集成websocket,实时读取日志日志输出到页面的小功能。

qq_16430873的博客 3643

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SpringBoot集成WebSocket--------Spring方式集成(一)

二、配置 1、WebSocketConfigurer配置器 2、@EnableWebSocket注解 (1)注解引入一个配置类DelegatingWebSocketConfiguration.class (2)DelegatingWebSocketConfiguration配置类会被容器自动加载,同时会注入容器中所有的WebSocketConfigurer实现到configurers中;同时registerWebSocketHandlers()方法会遍历configurers并回调所有WebSocketC

豢龙先生 6411

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

springboot2.0+websocket集成【群发消息+单对单】(一)

现在用springboot集成websocket变的很方便快捷了,下面简单写个小demo,实现群发消息,单对单的聊天。主要是功能,界面将就一下。 参考: http://tech.lede.com/2017/03/08/qa/websocket+spring/ https://blog.csdn.net/mr_zhuqiang/article/details...

暴躁兔子的记录 4247

springboot集成websocket(一)客户端、客户端断线重连、客户端连接验证

springboot集成websocket客户端 一、首先是导入依赖包 package com.easylink.websocket; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.integration.annotation.IntegrationComponentSc

yyn571002445的博客 5851

springBoot集成websocket中问题

问题一: 在springmvc中集成websocket时因为是使用外置tomcat,基本上没有太多的问题,但是在springboot中,因为springboot内置了tomcat,会导致websocket连接异常,直接出现404. 解决办法有两个: 1:使用外置tomcat。舍弃springboot内置tomcat 修改pom.xml中的 <dependency> <group...

weixin_38031274的博客 936

springboot3.5.8集成websocket问题

springboot3.5.8集成websocket遇到的问题

Mei超的博客 336

SpringBoot实现WebSocket服务端

SpringBoot中的WebSocket1. 什么是WebSocket2. SpringBoot如何集成WebSocket2.1 新建一个maven项目命名为websocket_server2.2 新增application.yml文件2.3 新增启动类2.1 @ServerEndPoint集成WebSocket2.2 实现WebSocketHandler方式集成WebSocket 1. 什么...

owner_zhou的博客 1684

Springboot集成websocket

Springboot集成websocket

囚徒之困 9460

SpringBoot 集成WebSocket详解

SpringBoot 集成WebSocket详解

Charge8的博客 4万+

springboot集成websocket的两种实现方式

WebSocket跟常规的http协议的区别和优缺点这里大概描述一下 一、websocket与http http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要有三次握手才能发送信息。http链接分为短链接,长链接,短链接是每次请求都要三次握手才能发送自己的信息。即每一个request对应一个response。长链接是在一定的期限内保持链接。保持TCP连接不断开。客...

huiyunfei的博客 8万+

SpringBoot2.0集成WebSocket,实现后台向前端推送信息

什么是WebSocket? - 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? - 答案很简单,因为 HTTP 协议有一个缺陷:***通信只能由客户端发起***,HTTP 协议做不到服务器主动向客户端推送信息。 https://github.com/moshowgame/spring-cloud-study/tree/master/spring-cloud-study-websocket

★【World Of Moshow 郑锴】★ 46万+

springboot集成websocket

​ 这里我们使用springboot搭建一个轻量级的websocket服务,同时提供4个入参。使用websocket服务可以轻松和微信小程序、支付宝小程序、网页就行双向通讯,非常实用方便。wss地址这里是我们自己搭建的中转服务websocket地址。参数说明。

大爱仙尊 3万+
上一篇: Lambda表达式和Java集合框架
下一篇: 藏在正则表达式里的陷阱
Tracyclock
博客等级 码龄10年 14粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值