当前位置: 代码网 > it编程>编程语言>Java > webSocket介绍与使用 spring boot 集成 websocket教程 java

webSocket介绍与使用 spring boot 集成 websocket教程 java

2024年08月01日 Java 我要评论
WebSocket介绍与使用 java spring boot集成WebSocket教程

目录

一、websocket简介

二、websocket优缺点

三、spring boot集成websocket

四、验证


一、websocket简介

        websocket建立在tcp协议上,是一种在单个tcp连接上进行全双工通信的协议。

        html5里面提出了websocket标准,目的是让服务器具有“主送”向浏览器推送信息的能力,它允许客户端和服务器之间建立持久连接,实现实时的数据传输功能。

websocket通讯分为两个阶段:

1.握手阶段

        客户端通过http请求发起握手请求,请求头包含一些特殊字段,如pgrade:websocket和connection:upgrade以及其他的websocket相关字段。

服务器收到客户端的websocket握手请求后,进行协议升级,将http升级为websocket连接。服务器返回一个websocket握手响应,相应头中包如:upgrade:websocket和connection:upgrade等websocket相关字段。

客户端收到服务器的websocket握手响应后,websocket连接就建立成功,客户端和服务端都可以发送和接收websocket消息。

2.数据交换阶段

        websocket建立成功后,客户端和服务器都可以通过websocket会话进行实时的双向数据交换。同时,客户端和服务端可以通过发送心跳数据帧来维持连接,如果在一段时间内没有收到心跳响应,则断开websocket连接。

二、websocket优缺点

1.优点

        支持双向通讯,实时性比较高,更加灵活。

        开销少,ws建立成功后,客户端、服务端进行数据交换,协议控制的数据包头部较小。http需要完整的头部信息。

        可扩展,websocket协议定义了扩展,用户可以扩展协议。

2.缺点

        服务端需要支持websocket协议。

        客户端连接数多,服务端压力大。

三、spring boot集成websocket

1.新建spring boot项目,再pom.xml加入以下配置

<parent>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-parent</artifactid>
    <version>2.1.18.release</version>
    <relativepath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-web</artifactid>
    </dependency>
    <!-- websocket依赖包 -->
    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-websocket</artifactid>
    </dependency>
</dependencies>

2.再spring boot启动类开启websocket功能

package com.example.demo;

import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.web.socket.config.annotation.enablewebsocket;

//开启websocket
@enablewebsocket
@springbootapplication
public class demoapplication {
    public static void main(string[] args) {
        springapplication.run(demoapplication.class, args);
    }

}

3.新建websoketconfig配置类

package com.example.demo.common.config.websocket;

import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.web.socket.server.standard.serverendpointexporter;

/**
 * websocket配置类
 */
@configuration
public class websocketconfig {
    @bean
    public serverendpointexporter serverendpointexporter() {
        return new serverendpointexporter();
    }
}

4.新建websocketserver服务类

package com.example.demo.common.config.websocket;

import org.springframework.stereotype.component;
import javax.websocket.*;
import javax.websocket.server.pathparam;
import javax.websocket.server.serverendpoint;
import java.io.ioexception;
import java.util.concurrent.concurrenthashmap;

/**
 * @serverendpoint:该注解用于暴漏外部ws的路径,类似@requestmapping注解。例如服务端口8080,请求地址:ws://localhost:8080/myws
 * 路径上{userid}  可在onopen连接成功方法使用@pathparam("userid") string userid接收数据
 */
@serverendpoint("/myws/{userid}")
@component
public class websocketserver {
    //线程安全的map,用来保存每个客户端对应的websocket对象
    private static concurrenthashmap<string, websocketserver> websocketmap = new concurrenthashmap<>();
    //单个客户端的session,通过session与对应客户端通讯
    private session session;
    //用户id
    private string userid;

    /**
     * 连接成功
     * @onopen注解:websocket 连接成功后,触发该注解修饰的方法
     * @param session
     */
    @onopen
    public void onopen(session session, @pathparam("userid") string userid) {
        this.session = session;
        this.userid = userid;
        if (websocketmap.containskey(userid)) {
            websocketmap.remove(userid);
            websocketmap.put(userid, this);
        } else {
            websocketmap.put(userid, this);
        }
        system.out.println("连接成功");
    }

    /**
     * 连接关闭
     * @onclose注解:websocket断开连接后,触发该注解修饰的方法
     * @param session
     */
    @onclose
    public void onclose(session session) {
        if (websocketmap.containskey(userid)) {
            websocketmap.remove(userid);
        }
        system.out.println("关闭连接");
    }

    /**
     * 接收消息
     * @onmessage注解:客户端发送消息时,触发该注解声明的方法
     * @param text
     * @return
     */
    @onmessage
    public void onmessage(string text) {
        system.out.println("后端接收前端web发送数据userid:" + userid + ",接收信息:" + text);
        if (websocketmap.containskey(userid)) {
            try {
                websocketmap.get(userid).session.getbasicremote().sendtext("返回web数据userid:" + userid + ",返回消息:" + text);
            } catch (ioexception e) {
                e.printstacktrace();
            }
        }
    }

    /**
     * 连接异常
     * @onerror注解:当建立的连接出现异常后,触发该注解修饰的方法
     * @param session
     * @param throwable
     */
    @onerror
    public void onerror(session session, throwable throwable) {
        system.out.println("websocket连接异常:" + throwable.getmessage());
    }

    /**
     * 服务器给指定websocket客户端发送信息
     * @param userid
     * @param message
     */
    public static void sendinfo(string userid, string message) {
        system.out.println("后端发送前端web数据userid:" + userid + "发送消息:" + message);
        if (websocketmap.containskey(userid)) {
            try {
                websocketmap.get(userid).session.getbasicremote().sendtext("后端发送前端web数据userid" + userid + ",内容:" + message);
            } catch (ioexception e) {
                e.printstacktrace();
            }
        }
    }
}

5.新建democontroller测试类,增加接口通过websocket给客户端发信信息

package com.example.demo.controller;

import com.example.demo.common.config.websocket.websocketserver;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.requestparam;
import org.springframework.web.bind.annotation.restcontroller;

@restcontroller
public class democontroller {

    @requestmapping("/demo")
    public boolean demo(@requestparam("userid") string userid, @requestparam("message") string mesage) {
        //给前端web推送数据
        websocketserver.sendinfo(userid, mesage);
        return true;
    }
}

四、验证

1.启动服务,访问websocket在线测试页面,与后端建立连接

2.后端显示连接成功

3.通过websocket给后端发送数据

4.后端打印接收到的数据

5.调用后端接口,通过websocket给前端推送数据

6.websocket在线测试页面收到数据

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com