spring接入socket.io注意事项

因为前端要求,最后我们采用的socket.io来做我们的消息推送,在联调期间遇到了一些问题,这里记录一下,首先我和前端参考了日常记录-SpringBoot整合netty-socketio和Vue3和SpringBoot集成SocketIO(WebSocket)

基本流程就是上面这样,然后后端使用的版本是:

java 复制代码
<!-- netty-socketio: 仿`node.js`实现的socket.io服务端 -->
<dependency>
   <groupId>com.corundumstudio.socketio</groupId>
   <artifactId>netty-socketio</artifactId>
   <version>2.0.9</version>
</dependency>

前端使用的版本是

socketio 4.7.5

捕捉不到事件

遇到的问题是:后端启动没问题,前端连接也显示101,可是后端的OnConnect事件完全没动静。

然后前端发出的链接会在域名+端口后面带个socket.io,类似于:

javascript 复制代码
http://localhost:9999/socket.io?userId=12345

通过查看后端的连接,发现的确有一个连接,然后连接的context是socket.io,但是我后端的socket.io上什么事件都没绑定,修改方式是:

handlebars 复制代码
package com.gzgs.socketio.common.config;

import com.corundumstudio.socketio.SocketConfig;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.annotation.SpringAnnotationScanner;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;
import java.util.Optional;

@Configuration
public class SocketIOConfig {

    @Value("${socketio.host}")
    private String host;

    @Value("${socketio.port}")
    private Integer port;

    @Value("${socketio.bossCount}")
    private int bossCount;

    @Value("${socketio.workCount}")
    private int workCount;

    @Value("${socketio.allowCustomRequests}")
    private boolean allowCustomRequests;

    @Value("${socketio.upgradeTimeout}")
    private int upgradeTimeout;

    @Value("${socketio.pingTimeout}")
    private int pingTimeout;

    @Value("${socketio.pingInterval}")
    private int pingInterval;

    @Value("${socketio.namespaces}")
    private String[] namespaces;

    @Bean
    public SocketIOServer socketIOServer() {
        SocketConfig socketConfig = new SocketConfig();
        socketConfig.setTcpNoDelay(true);
        socketConfig.setSoLinger(0);
        com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration();
        config.setSocketConfig(socketConfig);
        config.setHostname(host);
        config.setPort(port);
        config.setBossThreads(bossCount);
        config.setWorkerThreads(workCount);
        config.setAllowCustomRequests(allowCustomRequests);
        config.setUpgradeTimeout(upgradeTimeout);
        config.setPingTimeout(pingTimeout);
        config.setPingInterval(pingInterval);
        //注意,这里设定啥,前端的path就要设定啥,如果两边都不设定的话,默认就是socket.io
		config.setContext("/websocket")
        //服务端
        final SocketIOServer server = new SocketIOServer(config);

        //添加命名空间(如果你不需要命名空间,下面的代码可以去掉)
        Optional.ofNullable(namespaces).ifPresent(nss ->
                Arrays.stream(nss).forEach(server::addNamespace));


        return server;
    }

    //这个对象是用来扫描socketio的注解,比如 @OnConnect、@OnEvent
    @Bean
    public SpringAnnotationScanner springAnnotationScanner() {

        return new SpringAnnotationScanner(socketIOServer());
    }
}

收不到消息

第二个问题是,前端获取不到后端推送的消息,这主要是因为我对socket.io的理解不到位,socket.io发送消息一般是用sendEvent,这个方法需要传入event前端才能通过event获取到相应的消息,需要注意一下。

相关推荐
张小姐的猫3 小时前
【基于 WebSocket 的多用户网页五子棋】—— 项目结构设计与实用工具类模块
网络·websocket·网络协议
新*1 天前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化
javascript·python·websocket·性能优化·blob·zlib·arraybuffer
️公子1 天前
可插拔 13 款实时棋牌对战平台实践:房间容器、Plugin SDK 与幂等账本
websocket·typescript·游戏开发·monorepo·插件架构·棋牌平台·实时对战
guizhoumen8 天前
net core下WebSocket请求总是断开的解决方案
网络·websocket·网络协议
QianhangQianping10 天前
WebSocket实时推送+ HTTP 定时轮询:一块大屏两套取数怎么不打架
前端·websocket·网络协议·http·低代码·架构·数据可视化
web打印社区11 天前
Lodop排障总纲-常见报错一张表
开发语言·前端·javascript·chrome·websocket
Da Da 泓12 天前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
web打印社区13 天前
Chrome-kiosk-printing能上生产吗
开发语言·前端·javascript·chrome·websocket
XiYang-DING15 天前
【WebSocket】文本帧Text Frame
网络·websocket·网络协议
TickDB15 天前
美股历史数据下载:用 Codex 取数,Python 导出 CSV
python·websocket·mcp·行情数据 api