springboot 整合websocket

WebSocket 实战:从零搭建到前后端交互
本文详细介绍了如何从零开始搭建WebSocket服务,包括在Spring Boot中添加依赖、配置WebSocket,创建服务端连接,并在前端HTML页面中实现WebSocket连接。通过这个过程,读者可以了解到WebSocket的基本用法以及在实际应用中的消息传递方式。同时,文章提到了在Tomcat部署时可能遇到的问题以及解决方案。

1.添加pom依赖

        <!--websocket依赖包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

2.添加配置文件

@Configuration
public class WebSocketConfig {
    /**
     * 注入ServerEndpointExporter之后,
     *
     * 这个bean会自动注册使用了@ServerEndpoint注解声明的websocket
     * @return
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

3.服务端webSocket连接

@ServerEndpoint(value = "/websocket/{name}/{password}")// websocket连接点映射.
@Component
public class ChatSocket {
    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;
    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
    private static CopyOnWriteArraySet<ChatSocket> webSocketSet = new CopyOnWriteArraySet<ChatSocket>();

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

    //接收sid
    private String sid = "";

    /**
     * 成功建立连接调用的方法.
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("name") String name, @PathParam("password") String password) {
        System.out.println("服务端接收到消息:");
        System.out.println(name);
        System.out.println(password);
    }

    /**
     * 连接关闭调用的方法.
     */

    @OnClose
    public void onClose() {

    }

    /*
     * 收到客户端消息后调用的方法.
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println(message);
    }

    /**
     * 发生错误时调用.
     */
    @OnError
    public void onError(Session session, Throwable error) {

    }
}

4.html页面websocket编写

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>
<style>


    .clearfix {
        zoom: 1;
    }

    .clearfix:after {
        display: block;
        content: '';
        clear: both;
        height: 0;
        visibility: hidden;
    }

    .header, .footer {
        height: 70px;
        text-align: center;
    }

    .content {
        margin: 0 auto;
        width: 1000px;
    }

    .side {
        float: left;
        height: 500px;
        width: 280px;
    }

    .main {
        float: right;
        height: 500px;
        width: 700px;
    }

</style>
<body>

<div class="content clearfix">
    <div class="side">
        <p>聊天列表</p>
        <!--  <div style="width: 100px;height: 200px;outline: 1px darkkhaki solid;"></div>-->
        <div id="ownerchatList" style="width: 200px;height: 300px;border: 1px solid black">
        </div>
    </div>
    <div class="main">


        <div style="overflow-y:auto; overflow-x:auto; width:400px; height:400px;outline: 1px darkkhaki solid;margin-top: 20px"
             id="message">

        </div>
        <div style="width: 450px;height: 30px;">
            <div style="width: 450px;height: 30px;">
                <input type="text" id="text" style="width: 397px;height: 25px" name="text"/>
                <button onclick="send()" id="btnAdd" >发送</button>

            </div>
        </div>

        <div></div>
    </div>

    <table>
        <tbody id="tbody"></tbody>
    </table>
</div>
<div class="footer">
    <p>消息提醒</p>
    <div id="tixing" style="width: 350px;height: 150px;border: 1px solid black;margin-left: 620px">
    </div>
</div>


<script>
    var websocket = null;
    var name = 'bb'
    var passwords = '123456'
    var serverPaths = 'localhost:8080'
    window.onload = conectWebSocket()
    //连接对象.



    function conectWebSocket() {
        //判断当前的浏览器是否支持websocket.
        if ("WebSocket" in window) {
            url = "ws://" + serverPaths + "/websocket/" + name + "/" + passwords;
            websocket = new WebSocket(url);
        } else {
            alert("Not support websocket");
            return false;
        }
        //连接成功的方法.
        websocket.onopen = function (event) {
            setMessgeHtml("Loc MSG:连接成功");
        }

        //连接关闭.
        websocket.onclose = function (event) {
            setMessgeHtml("Loc MSG:连接关闭");
        }

        //连接异常.
        websocket.onerror = function (event) {
            setMessgeHtml("Loc MSG:连接异常");
        }
        websocket.onmessage = function (event) {
            setMessgeHtml(event.data);
        }
    }

    function closeWebSocket() {
        this.websocket.close();
    }

    function setMessgeHtml(msg) {
        var message = document.getElementById("message");
        message.innerHTML += msg + "<br/>";

    }

    /**
     发送消息.
     */
    function send(){
        var message = document.getElementById("text").value;

        var socketMsg = {'msg':message ,'type':"text"}

        websocket.send(JSON.stringify(socketMsg));//将json对象转换为json字符串.
        $(" #text").val("");

    }
</script>
</body>
</html>

websocket初步搭建完成
运行系统后,
在这里插入图片描述
在这里插入图片描述
证明与服务端连接成功。

websocket是长连接,通过页面向服务端发送信息.

前端通过send()方法,将信息发送给服务器,其中将信息用json形式处理。因为一条正常的消息,可能是文本,可能是图片,可能是视频,我们必然需要一个type,如果每条消息都要保存进数据库,那么这条消息是谁发的,发送给谁,等等一系列字段都需要传入服务端。
用json序列化,就能很好的保存这些数据。

在这里插入图片描述
在这里插入图片描述

这样,websocket连接就基本搭建成功了。

注意这里还有一个小坑,如果项目是在tomcat种部署,也就是war包发布,必须要将WebSocketConfig 上的 @Configuration 和 @Bean注解注释掉。
因为新版的tomcat中已经集成了websocket,两者会冲突,注释掉后,系统就会直接使用tomcat的websocket。

第二个坑就是如果这里有使用 @Autowired 注解,注入service层,会报错。

一般的service注入是这样的
@Autowired
ServiceA serviceA;

但是在这里,要换一种写法:

private static ServiceA  serviceA;
@Autowired
public void setServiceA(ServiceA  serviceA) {
    ChatWebsocket.serviceA= serviceA;
}

源码会放在下一章,

### Spring Boot 整合 WebSocket 示例教程 在 Spring Boot 中整合 WebSocket 可以实现客户端与服务端的实时通信。以下是一个完整的示例,涵盖依赖配置、WebSocket 配置类以及处理程序的实现。 #### 1. 添加依赖 首先,在项目的 `build.gradle` 文件中添加 WebSocket 相关的依赖项: ```groovy dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-websocket' } ``` 上述代码片段引入了 Spring Boot 的 WebSocket 支持模块[^1]。 #### 2. 创建 WebSocket 配置类 创建一个配置类来启用 WebSocket 支持,并注册 WebSocket 处理器。以下是一个简单的配置类示例: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/ws") .setAllowedOrigins("*"); // 允许跨域访问 } } ``` 上述代码通过 `registerWebSocketHandlers` 方法注册了一个 WebSocket 处理器,并指定了 `/ws` 作为 WebSocket 连接的 URL 路径[^3]。 #### 3. 实现 WebSocket 处理器 接下来,实现一个自定义的 WebSocket 处理器来处理消息和事件。以下是一个简单的处理器示例: ```java import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; public class MyWebSocketHandler extends TextWebSocketHandler { @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String payload = message.getPayload(); System.out.println("Received message: " + payload); session.sendMessage(new TextMessage("Echo: " + payload)); } } ``` 该处理器继承了 `TextWebSocketHandler`,并在 `handleTextMessage` 方法中实现了消息的接收与响应逻辑[^2]。 #### 4. 测试 WebSocket 功能 启动应用程序后,可以通过浏览器或 WebSocket 客户端工具连接到 `/ws` 路径进行测试。例如,使用 JavaScript 代码连接 WebSocket 服务器并发送消息: ```javascript const socket = new WebSocket("ws://localhost:8080/ws"); socket.onopen = function() { console.log("Connection established"); socket.send("Hello, Server!"); }; socket.onmessage = function(event) { console.log("Message from server:", event.data); }; ``` #### 5. WebSocket 的工作原理 WebSocket 使用 HTTP/1.1 的协议升级特性,通过特定的请求头(如 `Connection: Upgrade` 和 `Upgrade: websocket`)完成握手过程。一旦握手成功,客户端和服务端即可通过全双工连接进行实时通信[^4]。 --- ###
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值