spring接入socket.io注意事项

2024-04-29 09:28

本文主要是介绍spring接入socket.io注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

<!-- 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,类似于:

http://localhost:9999/socket.io?userId=12345

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

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;@Beanpublic 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.ioconfig.setContext("/websocket")//服务端final SocketIOServer server = new SocketIOServer(config);//添加命名空间(如果你不需要命名空间,下面的代码可以去掉)Optional.ofNullable(namespaces).ifPresent(nss ->Arrays.stream(nss).forEach(server::addNamespace));return server;}//这个对象是用来扫描socketio的注解,比如 @OnConnect、@OnEvent@Beanpublic SpringAnnotationScanner springAnnotationScanner() {return new SpringAnnotationScanner(socketIOServer());}
}

收不到消息

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

这篇关于spring接入socket.io注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/945709

相关文章

Java面试之SpringCloud篇

Nacos有什么用? ①服务注册与发现 ②配置管理 Es为什么查询效率快? (1)首先,ES使用了倒排索引这种数据结构来快速查找文档。倒排索引是一种针对文本搜索而优化的数据结构,它将每个词与出现这个词的文档列表关联起来,这样就可以快速查找包含某些词的文档。 (2)其次,ES使用了分布式系统的优势,可以利用多台机器的计算能力来处理查询。它将索引分成若干个分片,并在多台机器上进行分布式存储,这样

如何在springcloud分布式系统中实现分布式锁?

一、简介 一般来说,对数据进行加锁时,程序先通过acquire获取锁来对数据进行排他访问,然后对数据进行一些列的操作,最后需要释放锁。Redis 本身用 watch命令进行了加锁,这个锁是乐观锁。使用 watch命令对于频繁访问的键会引起性能的问题。 二、redis命令介绍 SETNX命令(SET if Not eXists) 当且仅当 key 不存在,将 key 的值设为 value ,并返

JavaWeb入门——在Windows环境下安装Tomcat服务器

在本号的一系列Spring Security文章中,先后介绍了各种登录验证及授权中的知识点,如:spring-security简介并与shiro对比、 formLogin模式登录认证、动态数据登录验证与权限分配、账户多次登录失败锁定、RememberMe记住我功能,等等文章。笔者觉得以上的这些实际上都很简单,我们没有涉及到分布式应用。本节将以分布式的应用背景,讲解验证码实现的多种方式。本小节先从

Spring Cloud Gateway VS Zuul比较

Spring Cloud Gateway 是 Spring Cloud Finchley 版推出来的新组件,用来代替服务网关:Zuul。 那 Spring Cloud Gateway 和 Zuul 都有哪些区别呢,咱们来比较一下。1、开源组织 Spring Cloud Gateway 是 Spring Cloud 微服务平台的一个子项目,属于 Spring 开源社区,依赖名叫:spring-cl

Java之Nginx静态资源部署

Java之Nginx静态资源部署   Java之Nginx静态资源部署,Nginx 是一款高性能的 http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师伊戈尔·西索夫(Igor Sysoev)所开发,官方测试 nginx 能够支支撑 5 万并发链接,并且 cpu、内存等资源消耗却非常低,运行非常稳定。 Nginx可以应用于网页静态服务

测试欧气的小游戏-java

Java 用我们学到的知识做处一个小的项目或者游戏等等应该都或多或少的有一点点的成就感吧,下列就是我用所学的基础知识做的猜字谜游戏,并且给他赋予了灵魂哈哈哈。有兴趣的可以尝试的用自己会的知识做一些小的游戏工具什么的提高自己,要不然你的知识不会那么简单的就融会贯通是吧! 有能力的可以把他改写的更加的nice,就把它当伪代码也行啊! 下列用到的基础知识方便有: if for while Random

Spring boot:获取项目路径的几种方式

代码对应的工程路径图:  1、获取当前项目工程下静态资源图片路径,以下两种方法皆可: /** * 方法一 */ String path = this.getClass().getResource("/static/img/logo.png").getPath(); System.err.println("path:" + path); // path:C:/Users/Administrato

Java-模块

一.代码块 静态代码块:使用static关键字声明的代码。优先于main方法执行。在类中定义的静 态代码块会优先于构造块执行,静态代码只执行一次。不能调用非静态代码块。静态变量也有默认初始化。 构造代码块:直接写在类中的代码块,只有在实例化对象的时候才会调用,并且优先于构造方法执行。每次实例化对象时都会执行构造中的代码,会执行多次。 局部代码块:即普通代码块,是直接在方法或语句中定义的代码块。和m

华为OD机试【统一限载货物数最小值】(java)(200分)

1、题目描述 火车站附近的货物中转站负责将到站货物运往仓库,小明在中转站负责调度 2K 辆中转车(K辆干货中转车,K 辆湿货中转车)货物由不同供货商从各地发来,各地的货物是依次进站,然后小明按照卸货顺序依次装货到中转车,一个供货商的货只能装到一辆车上不能拆装,但 是一辆车可以装多家供货商的货:中转车的限载货物量由小明统一指定,在完成货物中转的前提下,请问中转车的统一限载货物数最小值为多少。 2

使用Spring安全表达式控制系统功能访问权限

、SPEL表达式权限控制 从spring security 3.0开始已经可以使用spring Expression表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式函数        描述 hasRole([role])        用户拥有指定的角色时返回true (S