美文网首页
SpringBoot整合netty-socketio 集成 We

SpringBoot整合netty-socketio 集成 We

作者: 任未然 | 来源:发表于2023-01-08 17:15 被阅读0次

    一. 概述

    本demo简单介绍WebSocke的服务的搭建及事件监听处理及推送时间

    二. WebSocke服务搭建

    2.1 引入依赖

    <dependency>
                <groupId>com.corundumstudio.socketio</groupId>
                <artifactId>netty-socketio</artifactId>
                <version>1.7.16</version>
    </dependency>
    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    2.2 websocket服务器配置

    websocket服务器配置,包括服务器IP、端口信息、以及连接认证等配置

    @Configuration
    @EnableConfigurationProperties({WsConfig.class})
    public class ServerConfig {
    
        @Bean
        public SocketIOServer server(WsConfig wsConfig) {
            com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration();
            config.setHostname("127.0.0.1");
            config.setPort("8081");
    
            //这个listener可以用来进行身份验证
            config.setAuthorizationListener(data -> {
                // http://localhost:8081?token=xxxxxxx
                // 例如果使用上面的链接进行connect,可以使用如下代码获取用户密码信息,本文不做身份验证
                String token = data.getSingleUrlParam("token");
                // 校验token的合法性,实际业务需要校验token是否过期
                // 如果认证不通过会返回一个 Socket.EVENT_CONNECT_ERROR 事件
                return true;
            });
    
            return new SocketIOServer(config);
        }
    
        /**
         * Spring 扫描自定义注解
         */
        @Bean
        public SpringAnnotationScanner springAnnotationScanner(SocketIOServer server) {
            return new SpringAnnotationScanner(server);
        }
    }
    

    2.3 时间监听处理器

    核心事件处理类,主要处理客户端发起的消息事件,以及主动往客户端发起事件

    import cn.hutool.core.lang.Dict;
    import com.corundumstudio.socketio.AckRequest;
    import com.corundumstudio.socketio.SocketIOClient;
    import com.corundumstudio.socketio.SocketIOServer;
    import com.corundumstudio.socketio.annotation.OnConnect;
    import com.corundumstudio.socketio.annotation.OnDisconnect;
    import com.corundumstudio.socketio.annotation.OnEvent;
    import com.xkcoding.websocket.socketio.config.Event;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import java.util.Map;
    import java.util.UUID;
    
    @Component
    @Slf4j
    public class MessageEventHandler {
        
        @Autowired
        private SocketIOServer server;
    
        /**
         * 添加connect事件,当客户端发起连接时调用
         *
         * @param client 客户端对象
         */
        @OnConnect
        public void onConnect(SocketIOClient client) {
            String token = client.getHandshakeData().getSingleUrlParam("token");
            // ...业务处理
        }
    
        /**
         * 添加disconnect事件,客户端断开连接时调用,刷新客户端信息
         *
         * @param client 客户端对象
         */
        @OnDisconnect
        public void onDisconnect(SocketIOClient client) {
            String token = client.getHandshakeData().getSingleUrlParam("token");
            // ...业务处理
        }
    
        /**
         * 自定义时间
         *
         * @param client  客户端
         * @param request 请求
         * @param data    数据
         */
        @OnEvent(value = "自定义名")
        public void onEvent(SocketIOClient client, AckRequest request, Map data) {
            // ... 业务处理
            
            // 消息响应
            request.sendAckData(Dict.create().set("flag", true).set("message", "处理成功"));
        }
    
    
        /**
         * 推送消息
         * @param groupId 会话组ID
         * @param sessionId 会话ID
         * @param content 发生内容
         */
        public void sendMsg(SocketIOClient client,String groupId,UUID sessionId,String content) {
            // 将客户加入房间
            client.joinRoom(groupId);
            // 群发消息
            server.getRoomOperations(groupId).sendEvent(Event.GROUP, content);
            // 单个会话推送消息
            server.getClient(sessionId).sendEvent(Event.CHAT, content);
            
        }
    }
    

    2.4 websocket 服务器启动类

    @Component
    @Slf4j
    public class ServerRunner implements CommandLineRunner {
        @Autowired
        private SocketIOServer server;
    
        @Override
        public void run(String... args) {
            server.start();
            log.info("websocket 服务器启动成功。。。");
        }
    }
    

    三. 前端

    <!--  socket.io.js 文件可以自己百度下载  -->
        <script src="js/socket.io/socket.io.js"></script>
        <script>
            import io from "./js/socket.io/socket.io";
            const url = `http://127.0.0.1:8081?token=123456`;
            const socket = io.connect(url);
    
            // 连接
            function sendConnect() {
              socket.connect();
            }
            
            // 连接时间监听
            socket.on('connect', function () {
            });
    
            // 断开时间监听
            socket.on('disconnect', function () {
            });
    
            // 自定义时间监听
            socket.on('自定义名', function (data) {
            });
    
            // 断开
            function sendDisconnect() {
                socket.disconnect();
            }
    
            // 事件推送
            function sendJoin() {
              // 数据
              let data = {}
              socket.emit('自定义名', data);
            }
        </script>
    

    相关文章

      网友评论

          本文标题:SpringBoot整合netty-socketio 集成 We

          本文链接:https://www.haomeiwen.com/subject/abpucdtx.html