一.快速入门

1.导依赖

        <!-- socket.io依赖--><dependency><groupId>com.corundumstudio.socketio</groupId><artifactId>netty-socketio</artifactId><version>1.7.7</version></dependency><dependency><groupId>io.socket</groupId><artifactId>socket.io-client</artifactId><version>1.0.0</version></dependency>

2.在配置文件中做一些配置

这个配置写在服务端,客户端不用写,主要是一些socket.io的配置信息。

#socket.io配置
socketio.host=127.0.0.1(别写localhost,写服务器的ip)
socketio.port=9999
# 设置最大每帧处理数据的长度,防止他人利用大数据来攻击服务器
socketio.maxFramePayloadLength=1048576
# 设置http交互最大内容长度
socketio.maxHttpContentLength=1048576
# socket连接数大小(如只监听一个端口boss线程组为1即可)
socketio.bossCount=1
socketio.workCount=100
socketio.allowCustomRequests=true
# 协议升级超时时间(毫秒),默认10秒。HTTP握手升级为ws协议超时时间
socketio.upgradeTimeout=1000000
# Ping消息超时时间(毫秒),默认60秒,这个时间间隔内没有接收到心跳消息就会发送超时事件
socketio.pingTimeout=6000000
# Ping消息间隔(毫秒),默认25秒。客户端向服务器发送一条心跳消息间隔
socketio.pingInterval=25000

3.用上面配置文件中的信息创建Bean对象(服务端)

package com.guguo.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;@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;@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);return new SocketIOServer(config);}//这个对象是用来扫描socketio的注解,比如 @OnConnect、@OnEvent@Beanpublic SpringAnnotationScanner springAnnotationScanner() {return new SpringAnnotationScanner(socketIOServer());}
}

4.写Handler,里面包含了处理基本事件的方法(服务端)


import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.annotation.OnConnect;
import com.corundumstudio.socketio.annotation.OnDisconnect;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;@Slf4j
@Component
public class SocketIOHandler {@Autowiredprivate SocketIOServer socketIoServer;//服务端对象//Spring IoC容器创建之后,在加载SocketIOService Bean之后启动//服务端启动@PostConstructprivate void autoStartup() throws Exception {try {socketIoServer.start();}catch (Exception ex){ex.printStackTrace();log.error("SocketIOServer启动失败");}}//Spring IoC容器在销毁SocketIOService Bean之前关闭,避免重启项目服务端口占用问题//服务端关闭@PreDestroyprivate void autoStop() throws Exception {socketIoServer.stop();}//客户端连接的时候触发@OnConnectpublic void onConnect(SocketIOClient client) {String username = client.getHandshakeData().getSingleUrlParam("userName");SocketIOService.clientMap.put(username,client);//客户端:/127.0.0.1:64540  sessionId:9acac9ab-a000-43a7-bf97-31fac791e4f4 username: 张三已连接log.info("客户端:" + client.getRemoteAddress() + "  sessionId:" + client.getSessionId() +" username: "+ username+ "已连接");}//客户端关闭连接时触发@OnDisconnectpublic void onDisconnect(SocketIOClient client) {//客户端:9acac9ab-a000-43a7-bf97-31fac791e4f4断开连接log.info("客户端:" + client.getSessionId() + "断开连接");}}

5.客户端测试,Controller层代码:

import com.itheima.boot.service.SocketIOClientService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;@RestController
public class SocketIOClientController {@Autowiredprivate SocketIOClientService socketIOClientService;//测试和服务端的连接@GetMapping("/testConnect")public void testConnect() throws IOException {socketIOClientService.sendMessage("张三");}
}

6.客户端测试,Service层代码:

package com.itheima.boot.service;import io.socket.client.IO;
import io.socket.client.Socket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;@Slf4j
@Service
public class SocketIOClientService{public void sendMessage(String name) {// 服务端socket.io连接通信地址String url = "http://127.0.0.1:9999?userName="+name;System.out.println("lalalala");try {IO.Options options = new IO.Options();options.transports = new String[]{"websocket"};//失败后重试次数options.reconnectionAttempts = 2;// 失败重连的时间间隔options.reconnectionDelay = 1000;// 连接超时时间(ms)options.timeout = 500;final Socket socket = IO.socket(url, options);socket.connect();} catch (Exception e) {e.printStackTrace();}}}

7.结果

二.服务端发数据,客户端接收

1.服务端Controller代码

package com.guguo.controller;import com.guguo.service.SocketIOService;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class SocketIOController {@Autowiredprivate SocketIOService socketIOService;@GetMapping("/sendMessage")public void sendMessage(String message){socketIOService.sendMessageToAllUsers(message);}}

2.服务端Service代码

import com.corundumstudio.socketio.SocketIOClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Slf4j
@Service
public class SocketIOService {//使用ConcurrentMap来存储客户端public static Map<String, SocketIOClient> clientMap = new ConcurrentHashMap<>();//给每个事件进行定义,用于客户端和服务端之间的通信private static final String TEST_EVENT = "test_event";//给容器内所有的客户端发送信息public void sendMessageToAllUsers(String message){if(clientMap.isEmpty()){return;}for(String key:clientMap.keySet()) {SocketIOClient socketIOClient = clientMap.get(key);socketIOClient.sendEvent(TEST_EVENT,message);}}}

3.客户端接收代码

package com.itheima.boot.service;import io.socket.client.IO;
import io.socket.client.Socket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;@Slf4j
@Service
public class SocketIOClientService{public void sendMessage(String name) {// 服务端socket.io连接通信地址String url = "http://127.0.0.1:9999?userName="+name;try {IO.Options options = new IO.Options();options.transports = new String[]{"websocket"};//失败后重试次数options.reconnectionAttempts = 2;// 失败重连的时间间隔options.reconnectionDelay = 1000;// 连接超时时间(ms)options.timeout = 500;final Socket socket = IO.socket(url, options);//客户端监听某个事件,这个是系统定义的事件(链接事件)socket.on(Socket.EVENT_CONNECT, message -> System.out.println("连接成功"));// 自定义事件`test_event` -> 接收服务端成功连接消息socket.on("test_event", objects -> System.out.println(objects[0].toString()));socket.connect();while (true) {Thread.sleep(4000);// 向服务端发送消息socket.emit("push_data_event", "发送数据 " + "oejfjefwfwefw");}} catch (Exception e) {e.printStackTrace();}}}

4.注意问题和结果展示

服务端的逻辑是,向所有已经连接的客户端发送数据。所以,客户端要先向服务端发送请求连接,连接之后服务端将该客户端存到本地,然后再执行发送数据的逻辑。

客户端控制台:

服务端控制台:

SpringBoot集成SocketIO相关推荐

  1. springboot集成SocketIO实时通信

    https://blog.csdn.net/zsj777/article/details/83212776 概述 基于 socket.io 来说,采用 node 实现更加合适,本文使用两个后端的Jav ...

  2. SocketIO介绍+SpringBoot整合SocketIO完成实时通信

    Socket.IO笔记 即时通信是基于TCP长连接,建立连接之后,客户段/服务器可以无限次随时向对端发送数据,实现服务器数据发送的即时性 HTTP HTTP是短链接,设计的目的是减少服务器的压力 HT ...

  3. spring boot 集成socketIo 做消息推送

    spring boot 集成socketIo 做消息推送 项目需求 代码展示 客户端代码 服务端代码 项目需求 后台管理系统用户小铃铛,消息推送功能并展示有多少条消息或者小红点 代码展示 客户端代码 ...

  4. Windows下安装Mongodb SpringBoot集成MongoDB和Redis多数据源

    全文内容: Mongodb安装 说明:Mongodb和redis是开发中常用的中间件,Redis的安装使用比较简单就不写了,只说本地也就是Windows安装Mongodb. SpringBoot集成M ...

  5. SpringBoot集成FreeMarker

    给大家简单介绍一下springboot 集成FreeMarker 过程很简单,5分钟即可. 首先在项目中增添依赖spring-boot-starter-freemarker pom文件代码如下: &l ...

  6. springboot集成swagger2测试接口

    springboot集成swagger2测试接口 1.需要的依赖 2.开始编写一个swagger2 3.演示效果图片 1.需要的依赖 <dependency><groupId> ...

  7. springboot 集成logback

    springboot 集成logback 1.application.properties配置文件指定logback.xml logging.config=classpath:logback.xml ...

  8. springboot集成swagger2多模块中文配置详细步骤,解决集成mybatis或mybatis-plus无法正常使用问题

    springboot集成swagger2多模块中文配置详细步骤,解决集成mybatis或mybatis-plus无法正常使用问题 参考文章: (1)springboot集成swagger2多模块中文配 ...

  9. SpringBoot集成Quartz(解决@Autowired空指针Null问题即依赖注入的属性为null)

    SpringBoot集成Quartz(解决@Autowired空指针Null问题即依赖注入的属性为null) 参考文章: (1)SpringBoot集成Quartz(解决@Autowired空指针Nu ...

最新文章

  1. Busybox下的microcom用法
  2. Mysql查看状态,连接数,线程数以及Mysql性能监控工具doDBA的使用以及优化
  3. SSM整合支付宝支付功能
  4. 高效管理ASP.NET的JavaScript库
  5. 最全总结!聊聊 Python 发送邮件的几种方式
  6. python实现共轭梯度算法(含误差与运算次数的折线图)
  7. 实际工程中加快 Java 代码编写的小提示
  8. VC++6.0快捷键
  9. php无极分类非递归_PHP中的无限级分类、无限嵌套评论
  10. Java的ActiveX控件_注册ActiveX控件的几种方法 - 镜花水月 - JavaEye技术网站
  11. canvas lineWidth为1时线条粗细和颜色
  12. Keras学习教程七
  13. Ios android crash report,iOS App 后台 Crash 调查
  14. 智能车|直流电机、编码器与驱动器
  15. 比特率和采样率【转贴】
  16. 2019考研 | 天津大学计算机专硕复试131.25分考研经历与经验总结(复试)
  17. Js 日期字符串分别截取 年 月 日 时 分 秒
  18. SM2 SM3 SM4加密java实现
  19. 简单谈C++为什么是面向对象的程序设计
  20. java dispo lock_Rxjava2 学习记录。

热门文章

  1. canvas 签名/书写
  2. Linux电源管理_Generic PowerManager 之Suspend功能--(一)
  3. Linux电源管理之 Suspend
  4. 《拳霸风云》今日上映 杜海涛首次出演功夫片
  5. 冬季养生这样做!身体更健康
  6. 移动H2-3获取超管密码
  7. 管理者怎样做好企业管理?
  8. c语言scanf输入 a啥意思,c语言中的scanf(%s,a)的是什么意思?
  9. android倒计时框_在提示框中:视频游戏播放时间,维修电脑鼠标和极简主义的Android计时器...
  10. 最新带前端首席赚钱省钱专家小程序源码1.5.8版