spring boot整合websocket最简单demo

1、先添加pom依赖

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

2、在springboot启动类中添加@EnableWebSocket注解和下面初始化bean代码


    /**
     * 初始化Bean,它会自动注册使用了 @ServerEndpoint 注解声明的 WebSocket endpoint
     * @return
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }

3、新建一个Controller


package cn.com.maxtech.websocket.web;

import org.springframework.web.bind.annotation.RestController;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@RestController
@ServerEndpoint("/online/{username}")
public class WebSocketController {
    /**
     * 模拟存储   在线用户
     */
    public static Map<String, Session> USERS_ONLINE = new ConcurrentHashMap<>();

    @OnOpen
    public void openSession(@PathParam("username") String username, Session session) throws IOException {
        //存储用户
        USERS_ONLINE.put(username, session);
        //向所有在线用户发送用户上线通知消息
        Iterator<Session> sessionIteratorr = USERS_ONLINE.values().iterator();
        while (sessionIteratorr.hasNext()){
            sessionIteratorr.next().getAsyncRemote().sendText( "["+username+"]进入聊天室,当前在线数量:"+USERS_ONLINE.size());//异步发送
        }
    }
    @OnClose
    public void closeSession(@PathParam("username") String username, Session session){
        //删除用户
        USERS_ONLINE.remove(username);
        //向所有在线用户发送用户下线通知消息
        Iterator<Session> sessionIteratorr = USERS_ONLINE.values().iterator();
        while (sessionIteratorr.hasNext()){
            sessionIteratorr.next().getAsyncRemote().sendText( "["+username+"]离开了聊天室,当前在线数量:"+USERS_ONLINE.size());//异步发送
        }
        //下线后关闭session
        try {
            session.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @OnMessage
    public void onMessage(@PathParam("username") String username, String message){
        //向聊天室中的人发送消息
        Iterator<Session> sessionIteratorr = USERS_ONLINE.values().iterator();
        while (sessionIteratorr.hasNext()){
            sessionIteratorr.next().getAsyncRemote().sendText( "["+username+"]:" + message);//异步发送
        }
    }
    @OnError
    public void sessionError(Session session, Throwable throwable){
        try {
            session.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("WebSocket连接发生异常,message:"+throwable.getMessage());
    }
}

4、新建一个html文件

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
 <script type="text/javascript" src="../jquery.js"></script>
</head>
<body>
<button id="sendBtn" value="发送">发送</button>
<button id="leaveBtn" value="离开">离开</button>
<script type="text/javascript">
    $(function(){
        var webSocket = new WebSocket('ws://localhost:8181/online/'+$.getUrlParam("username"));
        webSocket.onopen = function (){
            console.log('webSocket连接创建。。。');
        }
        webSocket.onclose = function(){
            console.log('本人已离开');
        }
        webSocket.onmessage = function(event){
            console.log("收到消息:"+event.data)
        }
        webSocket.onerror = function (event) {
            console.log('webSocket连接异常。。。');
        }
        //发送消息
        $('#sendBtn').click(function(){
            webSocket.send("123");
        });
        //退出聊天室
        $('#leaveBtn').click(function(){
            webSocket.close();
        });
    });</script>
</body>
</html>

5、简单demo已完成,结果如下图:

 

 

其他功能:


一、自定义类,实现HandshakeInterceptor 接口。
1、实现beforeHandshake方法(握手之前做啥),例如握手之前可以注册用户信息,绑定WebSocketSession等。
2、实现afterHandshake方法(握手之后做啥)

二、自定义类,实现WebSocketHandler 接口,实现例如:
1、afterConnectionEstablished方法(连接成功之后做啥)
2、handleMessage方法(处理要发送的消息)
3、handleTransportError方法(传输错误之后做啥)
4、afterConnectionClosed(连接关闭之后做啥)

三、自定义@Configuration配置类,实现 WebSocketConfigurer 接口,
1、重写registerWebSocketHandlers方法(配置允许访问的域、注册 Handler和拦截器)
例如:
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(MyWebSocketHandler, "/cate").addInterceptors(MyHandshakeInterceptor).setAllowedOrigins("*");
}
addInterceptors添加拦截器(第一步自定义的类)
addHandler添加对此次地址为/cate的websocket连接做处理的handler(第二步自定义的类)
setAllowedOrigins允许指定的域名连接
 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单Spring Boot 集成 WebSocketDemo。 首先,你需要在 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 然后,在 Spring Boot 的启动类上添加 `@EnableWebSocket` 注解。 ```java @SpringBootApplication @EnableWebSocket public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 接下来,创建一个 Websocket 处理器(Handler)类,用来处理 WebSocket 消息的收发。 ```java @Component public class WebSocketHandler extends TextWebSocketHandler { private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); System.out.println("New session established: " + session.getId()); } @Override public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException { System.out.println("Received message: " + message.getPayload()); for (WebSocketSession webSocketSession : sessions) { if (webSocketSession.isOpen() && !session.getId().equals(webSocketSession.getId())) { webSocketSession.sendMessage(message); } } } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { sessions.remove(session); System.out.println("Session closed: " + session.getId()); } } ``` 在上面的代码中,我们使用 `TextWebSocketHandler` 类来处理文本消息。当客户端连接上 WebSocket 服务器时,`afterConnectionEstablished` 方法会被调用;当客户端发送消息时,`handleTextMessage` 方法会被调用;当客户端断开连接时,`afterConnectionClosed` 方法会被调用。在 `afterConnectionEstablished` 方法中,我们将当前 WebSocket 会话添加到 `sessions` 集合中;在 `handleTextMessage` 方法中,我们将接收到的消息转发给其他客户端;在 `afterConnectionClosed` 方法中,我们将当前 WebSocket 会话从 `sessions` 集合中移除。 最后,我们需要定义一个 WebSocket 配置类,用来注册我们创建的 WebSocket 处理器。 ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Autowired private WebSocketHandler webSocketHandler; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(webSocketHandler, "/websocket").setAllowedOrigins("*"); } } ``` 在上面的代码中,我们使用 `WebSocketConfigurer` 接口来配置 WebSocket。首先,我们注入了之前创建的 WebSocket 处理器 `WebSocketHandler`;然后,我们在 `registerWebSocketHandlers` 方法中,使用 `WebSocketHandlerRegistry` 注册了我们的 WebSocket 处理器,并指定了 WebSocket 的路径为 `/websocket`,允许跨域访问。 至此,一个简单Spring Boot 集成 WebSocketDemo 就完成了。你可以在前端页面中使用 `WebSocket` 对象连接到 `/websocket` 路径,来实现 WebSocket 的消息收发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值