Springboot对Websocket的实现

这篇具有很好参考价值的文章主要介绍了Springboot对Websocket的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文章是使用Springboot+WebSocket简单实现一个web界面的聊天室

springboot websocket,springboot,websocket,java,spring boot

项目结构如下

 springboot websocket,springboot,websocket,java,spring boot

  1. 首先在springboot项目的pom.xml中导入所需要的依赖包web、websocket以及解析JSON格式的fastjson
<dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.7</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
    </dependencies>

2.实现前端登录界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="GBK">
    <title>Title</title>
    <script src="js/jquery-3.4.1.min.js"></script>
    <!-- 将boostrap的css导入进来-->
    <link rel="stylesheet" type="text/css" href="js/boostrap/css/bootstrap.css">

    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .wrap{
            width: 500px;
            height: 400px;
            position: relative;
            top: 70px;
            border: 1px dodgerblue solid;
            border-radius: 10px;
            margin: 0 auto;
        }
        .head{
            background-color: #2b669a;
            color: white;
            text-align: center;
            border-radius: 10px 10px 0 0;
        }
        h1{
            padding: 30px;
            margin: 0px;
        }
        .body{
            padding: 50px;
            background-color: white;
        }

        html,body {
            height: 100%;
        }
        #btn{
            margin-left: 100px;
        }
        body {
            height: 100%;
            /*  for IE */
            filter: progid:DXImageTransform.Microsoft.gradient( startColorstr=white, endColorstr=lightblue);
            /* for other Browser */
            background-image: linear-gradient(bottom, lightblue 0%, white 100%);
            background-image: -o-linear-gradient(bottom, lightblue 0%, white 100%);
            background-image: -moz-linear-gradient(bottom, lightblue 0%, white 100%);
            background-image: -webkit-linear-gradient(bottom, lightblue 0%, white 100%);
            background-image: -ms-linear-gradient(bottom, lightblue 0%, white 100%);
        }
        #btn3{
            padding: 10px;
            border-radius: 5px;
            background: #01aaed;
        }
        /*当屏幕大小小于768的时候*/
        @media screen and (max-width: 768px) {
            .wrap{
                width: 100% !important;
                height: 100% !important;
                top: 0;
                background-color: white;
            }
            h1{
                font-size: 20px !important;
            }
            .form-group{
                margin: 20px;
            }
        }


    </style>
</head>
<body>
    <div class="wrap">
        <div class="head"><h1>欢迎使用V2.0聊天室</h1></div>
        <div class="body">
            <from id="form">
                <div class="form-group"><label>账号: </label><input id="username" class="form-control" name="username"></div>
                <div class="form-group"><label>密码: </label><input id="password" class="form-control" name="password"></div>
                <div id="btn" class="form-group">
                    <button type="button" onclick="ajaxdl()" id="btn3" class="btn btn-primary">登录</button>
                </div>
            </from>
        </div>
    </div>

    <script>
        function ajaxdl(){
            $.ajax({
                url:"login",
                data: {
                    username:document.getElementById("username").value,
                    password:document.getElementById("password").value
                },
                success:function (res){
                    if (res == '1'){
                        window.location.href="ws.html"
                    }else{
                        alert("密码错误")
                    }
                }
            })
        }
    </script>
    
<script>
</script>
</body>
</html>

3.校验账密,并将将用户登录状态存储到session中

@RestController
public class LoginController {
    @RequestMapping("/login")
    public String login(HttpServletRequest request){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if (password.equals("123")){
            request.getSession().setAttribute("user",username);
            return "1";
        }else{
            return "登录失败";
        }
    }
}

4.进入聊天室界面

4.1身份校验后,建立websocket连接,接收消息

<script>
    var ws;
    jQuery.ajax({
        url:"check",
        success(res){
            if (res == 'SUCCESS'){
                alert("你还没有登录,请先去登录!")
                window.location.href="boostrap.html"
            }else{
                var name = document.getElementById("user-name");
                name.innerHTML = res;

                var user = res;

                //建立websocket连接
                if ('WebSocket' in window) {
                    ws = new WebSocket("ws://localhost:8080/ws?loginuser="+user);
                } else if ('MozWebSocket' in window) {
                    ws = new MozWebSocket("ws://localhost:8080/ws?loginuser="+user);
                } else {
                    console.log('Error: WebSocket is not supported by this browser.');
                    return;
                }
            }

            //实现接收消息的事件-+
            ws.onmessage=function(res){
                var msg = JSON.parse(res.data);
                if (msg.code == 1){
                    $("#listcontent").append("<div>"+msg.message+"</div>");
                    //更新聊天列表
                    $("#userlist").empty();
                    for (var i = 0; i < msg.data.length; i++) {
                        $("#userlist").append("<div>"+msg.data[i]+"</div>");
                    }
                    //更新在线人数
                    var lab = document.getElementById("lab");
                    lab.innerHTML = msg.data.length;

                }else if(msg.code == 2){
                    $("#listcontent").append("<div>"+msg.message+"</div>");
                }else if(msg.code == 3){
                    $("#listcontent").append("<div>"+msg.message+"</div>");
                }
            }
        }
    })
</script>

4.2前端聊天室界面代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="GBK">
    <title>Title</title>

    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <script src="js/jquery-3.4.1.min.js"></script>
    <style>

        .content{
            position: relative;
            height: 400px;
            width: 380px;
            border: black 5px solid;
            border-radius: 20px;
            overflow-y: auto;
            display: inline-block;
        }
        @media screen and (max-width: 768px) {

        }

        #userlist{
            display: inline-block;
            height: 150px;
            width: 50px;
            border: black 1px solid;
            overflow-y: auto;
            float: right;
        }
        .hhh{
            position: relative;
            left: 200px;
            margin: 0;
            padding: 0;
        }
        h1{
            margin: 0;
            padding: 0;
            display: inline-block;
        }
        #msg{
            border: 2px solid black;
            border-radius: 4px;
        }
        #userlist{
            border-color:#01aaed;
        }
        .btn1{
            padding: 10px;
            border-radius: 5px;
            background: #01aaed;
        }
        .btn2{
            padding: 10px;
            border-radius: 5px;
            background: #01aaed;
        }
    </style>
</head>
<body>
<h1>聊天室V3.0</h1>
<div class="hhh"><h5>在线人数: <label id="lab"></label></h5></div>
<script>
    var ws;
    jQuery.ajax({
        url:"check",
        success(res){
            if (res == 'SUCCESS'){
                alert("你还没有登录,请先去登录!")
                window.location.href="boostrap.html"
            }else{
                var name = document.getElementById("user-name");
                name.innerHTML = res;

                var user = res;

                //建立websocket连接
                if ('WebSocket' in window) {
                    ws = new WebSocket("ws://localhost:8080/ws?loginuser="+user);
                } else if ('MozWebSocket' in window) {
                    ws = new MozWebSocket("ws://localhost:8080/ws?loginuser="+user);
                } else {
                    console.log('Error: WebSocket is not supported by this browser.');
                    return;
                }
            }

            //实现接收消息的事件-+
            ws.onmessage=function(res){
                var msg = JSON.parse(res.data);
                if (msg.code == 1){
                    $("#listcontent").append("<div>"+msg.message+"</div>");
                    //更新聊天列表
                    $("#userlist").empty();
                    for (var i = 0; i < msg.data.length; i++) {
                        $("#userlist").append("<div>"+msg.data[i]+"</div>");
                    }
                    //更新在线人数
                    var lab = document.getElementById("lab");
                    lab.innerHTML = msg.data.length;

                }else if(msg.code == 2){
                    $("#listcontent").append("<div>"+msg.message+"</div>");
                }else if(msg.code == 3){
                    $("#listcontent").append("<div>"+msg.message+"</div>");
                }
            }
        }
    })
</script>

<div id="listcontent" class="content">

</div>
<div id="userlist">

</div>
<div class="ddd">当前用户: <label id="user-name"></label></div>
<div>
    <input  id="msg"><button style="margin-left: 3px"  class="btn1" onclick="send()">发送</button>
    <button class="btn2" onclick="sl()">私聊</button>
</div>

<script>
    function send(){
        ws.send(document.getElementById("msg").value);
        $("#msg").val("");
    }

    //监听消息内容插入事件,滚动到底部
    $("#listcontent").on('DOMNodeInserted',function(){
        //滚动到底部
        setTimeout(function(){
            var boxElement=document.getElementById("listcontent");
            boxElement.scrollTop=boxElement.scrollHeight-boxElement.clientHeight;
        },100);
    })

    function sl(){
       var me = prompt("请输入你私聊对象的账号: ");
       ws.send(document.getElementById("msg").value+"="+me);
    }
</script>
</body>
</html>

5.后台从Tomcat7.0.5开始支持WebSocoket,主要可以通过以下两种方式进行定义,本文章是使用注解方式实现的

  1. 第一种是编程式,即继承类javax.websocket.Endpoint并实现其方法。
  2. 第二种是注解式,添加@ServerEndpoint相关注解。

5.1建立连接的onOpen方法,使用hashMap保存连接用户的session的session中保存的用户名称

@OnOpen
    public void onOpen(Session session, EndpointConfig endpointConfig) {
        System.out.println("有客户端连接了");
        String msg = session.getQueryString();
        try {
            msg = URLDecoder.decode(msg, "utf-8");
            //对msg进行解析
            String[] split = msg.split("=");
            String loginUser = split[1];
            //将session和用户名称保存到map集合中
            sessionMap.put(session, loginUser);

            Msg m = new Msg();
            m.setCode(Msg.CHANGE);
            m.setMessage(loginUser + "进入了聊天室");
            List<String> list = new ArrayList<>();
            for (Session s : sessionMap.keySet()) {
                list.add(sessionMap.get(s));
            }
            m.setData(list);

            boardcast(sessionMap.keySet(), JSON.toJSONString(m));

        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

 5.2 onClose 当会话关闭时调用

//当前端socket关闭的时候
    @OnClose
    public void onClose(Session session) {
        //将用户从聊天室移除
        String name = sessionMap.get(session);
        sessionMap.remove(session);

        Msg m = new Msg();
        m.setCode(Msg.CHANGE);
        m.setMessage(name + "离开了聊天室");
        List<String> list = new ArrayList<>();
        for (Session s : sessionMap.keySet()) {
            list.add(sessionMap.get(s));
        }
        m.setData(list);

        boardcast(sessionMap.keySet(), JSON.toJSONString(m));
    }

5.3服务器端通过onMessage接收前端用户ws.send()的消息

//浏览器中使用ws.send()的时候,服务器接收到的请求
    @OnMessage
    public void onMessage(String message, Session session) {

        if (message.contains("=")){
            //私聊
            String[] split = message.split("=");
            String name = sessionMap.get(session);
            Msg ms = new Msg();
            ms.setCode(Msg.SF);
            ms.setMessage(name + ": " + split[0]);
            System.out.println(split[0]);
            Session sess = null;
            for (Session s : sessionMap.keySet()) {
                if (sessionMap.get(s).equals(split[1])) {
                    sess = s;
                }
            }
            try {
                session.getBasicRemote().sendText(JSON.toJSONString(ms));
                sess.getBasicRemote().sendText(JSON.toJSONString(ms));
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

        }else{
            String name = sessionMap.get(session);
            System.out.println(name);
            Msg ms = new Msg();
            ms.setCode(Msg.TEXT);
            ms.setMessage(name + ": " + message);
            boardcast(sessionMap.keySet(), JSON.toJSONString(ms));
        }
    }

5.4将其中一个客户端发送的消息广播给所有的客户端

//广播
    public void boardcast(Set<Session> sessionSet, String msg) {
        for (Session s : sessionSet) {
            try {
                s.getBasicRemote().sendText(msg);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

5.5在springboot内置容器中运行时,必须提供ServerEndpointExporter 文章来源地址https://www.toymoban.com/news/detail-595412.html

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

到了这里,关于Springboot对Websocket的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot(java)实现websocket实现实时通信

    WebSockets是一种在Web应用程序中实现实时通信的技术。它允许客户端和服务器之间建立持久的、双向的通信通道,从而使得服务器可以实时向客户端推送数据,而不需要客户端不断地向服务器发起请求。这种实时通信的能力对于需要即时更新数据的应用程序非常有用,比如在线

    2024年04月29日
    浏览(32)
  • Java21 + SpringBoot3使用spring-websocket时执行mvn package报错

    近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。 本项目为前后端分离开发,后端基于 Java21 和 SpringBoot3 开发,前端提供了vue、angular、react、uniap

    2024年02月02日
    浏览(55)
  • 【Spring实战项目】SpringBoot3整合WebSocket+拦截器实现登录验证!从原理到实战

    🎉🎉 欢迎光临,终于等到你啦 🎉🎉 🏅我是 苏泽 ,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 《Spring 狂野之旅:从入门到入魔》 🚀 本专栏带你从Spring入门到入魔   这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.

    2024年04月17日
    浏览(40)
  • Java实现森林火灾预警系统 websocket+JAVA+Vue+SpringBoot+MySQL

    基于websocket+Vue+SpringBoot+MySQL的森林火灾预警系统,包含园区数据模块、温度传感器模块、烟雾传感器模块、园区监控模块、园区报警历史模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,森林火

    2024年02月01日
    浏览(28)
  • 【Java】SpringBoot快速整合WebSocket实现客户端服务端相互推送信息

    目录 什么是webSocket? webSocket可以用来做什么? WebSocket操作类 一:测试客户端向服务端推送消息 1.启动SpringBoot项目 2.打开网站 3.进行测试消息推送 4.后端进行查看测试结果 二:测试服务端向客户端推送消息 1.接口代码 2.使用postman进行调用 3.查看测试结果         WebSocke

    2024年01月20日
    浏览(37)
  • Java:SpringBoot整合WebSocket实现服务端向客户端推送消息

    思路: 后端通过websocket向前端推送消息,前端统一使用http协议接口向后端发送数据 本文仅放一部分重要的代码,完整代码可参看github仓库 websocket 前端测试 :http://www.easyswoole.com/wstool.html 依赖 项目目录 完整依赖 配置 WebSocketServer.java 前端页面 websocket.html 前端逻辑 index.js 参

    2024年02月04日
    浏览(36)
  • java springboot 整合webSocket接入调用chatGPT3.5接口实现自由返回

    java springboot 中使用webSocket接入openAI接口调用chatGPT3.5接口实现自由返回 @Component @Anonymous @ServerEndpoint(“/websocket/{id}”) // 访问路径: ws://localhost:8080/websocket public class WebSocketServer { // try { // sendMessage(“WebSocket连接成功”); // } catch (Exception e) { // // } } /** * 发送消息 * @param message 要

    2024年02月14日
    浏览(40)
  • Spring Boot 实现 WebSocket 示例

    WebSocket协议提供了一种标准化的方法,通过单个TCP连接在客户机和服务器之间建立全双工、双向的通信通道。它是一种不同于HTTP的TCP协议,但被设计为在HTTP上工作,使用端口80和443,并允许重用现有的防火墙规则。 WebSocket 协议是独立的基于 TCP 协议。它与 HTTP 的唯一关系是

    2024年02月14日
    浏览(23)
  • SpringBoot整合Websocket(Java websocket怎么使用)

    WebSocket 是一种基于 TCP 协议的全双工通信协议,可以在浏览器和服务器之间建立 实时、双向的数据通信 。可以用于在线聊天、在线游戏、实时数据展示等场景。与传统的 HTTP 协议不同,WebSocket 可以保持 长连接 ,实时传输数据,避免了频繁的 HTTP 请求和响应,节省了网络带

    2024年02月10日
    浏览(29)
  • Spring Boot集成WebSocket实现消息推送

    项目中经常会用到消息推送功能,关于推送技术的实现,我们通常会联想到轮询、comet长连接技术,虽然这些技术能够实现,但是需要反复连接,对于服务资源消耗过大,随着技术的发展,HtML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

    2023年04月08日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包