spring boot 集成socketIo 做消息推送

  • 项目需求
  • 代码展示
    • 客户端代码
    • 服务端代码

项目需求

后台管理系统用户小铃铛,消息推送功能并展示有多少条消息或者小红点

代码展示

客户端代码


1.引入 socketIo.js<script src="/js/socket.io/socket.io.js"></script>
2. 自定义 socket.io 的请求处理<script src="/js/socket.io/socket-tools.js?t=<%=date.getTime()%>"></script>主要代码
// 创建socket 在后端项目中配置的socket 的端口
var socket = io("http://localhost:9098");// 用于连接后端的服务
/** 创建自定义事件 'news' 作用:接受服务端 socket.emit('news', 数据); 发出的数据*/socket.on('connect', function() {socket.emit('accept_send', JSON.stringify({//登录用户id和客户机的ip 作为请求socekt.io 的一个表示sysUserId : sysUserId}));
});socket.on('accept_response', function(data) {var obj = JSON.parse(data);// 输出服务端响应了数据if (obj.length > 99) {$("#sys_message_count").html("99+");} else {$("#sys_message_count").html(obj.length);}var html="";for (var i=0 ;i< obj.length && i<4;i++) {//小铃铛内容设置html +="<li class=\"msg-list\">" +"<a  οnclick=\"Detail(\'"+obj[i].id+"\',\'"+obj[i].type+"\')\" target=\"toolsAdmin\">"+"<p class=\"msg-title\">" +obj[i].title+"</p>"+"<p class=\"msg-content\">" +obj[i].content.substr(0,20)+"..."+"</p>"+"<p class=\"msg-time\">"+obj[i].createTimeTo+"</p></a></li>";}html+="";console.log(html);//删除ui 内容重新 然后重新添加$("#message_show").find("li").remove(); $("#message_show").append(html);});

服务端代码

服务端pom 主要是 netty-socketio

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.4.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><groupId>org.example</groupId><artifactId>SOC_IM</artifactId><version>1.0-SNAPSHOT</version><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><!-- <scope>runtime</scope> --></dependency><!-- https://github.com/mrniko/netty-socketio --><dependency><groupId>com.corundumstudio.socketio</groupId><artifactId>netty-socketio</artifactId><version>1.7.7</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.72</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.7</version></dependency></dependencies>
</project>

application.properties 文件 配置也是从别的地方拿的 没有深究每一项的配置

server.port=8084spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://local:3306/xkb?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
# 搜索指定包别名
#mybatis.typeAliasesPackage=com.xkb.ctc
# 配置mapper的扫描,找到所有的mapper.xml映射文件
#mybatis.mapperLocations=classpath*:mybatis/mapper/**/*Mapper.xml
# 加载全局的配置文件
#mybatis.configLocation=classpath:mybatis/mapper/mybatis-config.xml#============================================================================
# netty socket io setting
#============================================================================
# host在本地测试可以设置为localhost或者本机IP,在Linux服务器跑可换成服务器IP
socketio.host=localhost
socketio.port=9098
# 设置最大每帧处理数据的长度,防止他人利用大数据来攻击服务器
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
Application.java
@SpringBootApplication
@EnableAutoConfiguration
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/*** 存放前端链接用户ip 与sysUserId*  原版本只保存了客户端连接的ip 会导致推送 错误,需要绑定到对应的用户* @author K**/
public class UserInfoMapUtil {public static ConcurrentMap<String, Object> webUserInfoMap = new ConcurrentHashMap<>();public static void put(String key,Object object) {webUserInfoMap.put(key, object);}public static Object get(String key) {return webUserInfoMap.get(key);}public static void remove(String key) {webUserInfoMap.remove(key);}public static Collection<Object> getValues(){return webUserInfoMap.values();}public static ConcurrentMap<String, Object> getWebUserInfoMap(){return webUserInfoMap;}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;import com.corundumstudio.socketio.SocketIOServer;
/*** 服务启动执行,SpringBoot启动之后执行* @author K**/
@Primary
@Component
public class ServerRunner implements CommandLineRunner{private final Logger log = LoggerFactory.getLogger(getClass());@Autowiredprivate  SocketIOServer socketIOServer;@Overridepublic void run(String... args) throws Exception{socketIOServer.start();log.info("socket.io启动成功!");}}

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.corundumstudio.socketio.SocketConfig;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.annotation.SpringAnnotationScanner;@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;/*** 以下配置在上面的application.properties中已经注明* @return*/@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);socketConfig.setReuseAddress(true);//添加配置config.setBossThreads(bossCount);config.setWorkerThreads(workCount);config.setAllowCustomRequests(allowCustomRequests);config.setUpgradeTimeout(upgradeTimeout);config.setPingTimeout(pingTimeout);config.setPingInterval(pingInterval);return new SocketIOServer(config);}@Beanpublic SpringAnnotationScanner springAnnotationScanner(SocketIOServer socketServer) {return new SpringAnnotationScanner(socketServer);}
}
package com.soc.im.service;import com.alibaba.fastjson.JSONObject;
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.annotation.OnConnect;
import com.corundumstudio.socketio.annotation.OnDisconnect;
import com.corundumstudio.socketio.annotation.OnEvent;
import com.soc.im.utils.UserInfoMapUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Component
@EnableScheduling // 开启定时任务
public class SocketIoServer {private static final Logger log= LoggerFactory.getLogger(SocketIoServer.class);private static Map<String, SocketIOClient> clientMap = new ConcurrentHashMap<>();@OnConnectpublic void onConnect(SocketIOClient client) {String address = client.getSessionId().toString();log.info(address + "-------------------------" + "客户端已连接");clientMap.put(address, client);UserInfoMapUtil.put(address,client);}@OnDisconnectpublic void onDisconnect(SocketIOClient client) {String address = client.getSessionId().toString();log.info(address + "-------------------------" + "客户端已断开连接");clientMap.remove(address);UserInfoMapUtil.remove(address);}@OnEvent(value = "accept_send")public void onEvent(SocketIOClient client, AckRequest ackRequest, String data) {/**1.客户端推送advert_info事件时,onData接受数据,2.这里是string类型的json数据,还可以为Byte[],object其他类型3.获取客户端连接的ip4. sysUserId与 前端页面socket.io 请求 传参属性名称一致*/String address = client.getSessionId().toString();log.info("address:{}",address);log.info(address + ":客户端:************" + data);JSONObject gpsData = (JSONObject) JSONObject.parse(data);String sysUserId = gpsData.get("sysUserId") + "";UserInfoMapUtil.put(address, sysUserId);clientMap.put(address, client);
//      这里处理相关业务然后返回 String message 给前端log.info("返回客户端IP:" + address+"ID: "+sysUserId+"message: ");client.sendEvent("accept_response", "message");}/**1.获取全部客户端2.获取客户端连接的ip定时更新小铃铛信息*/@Scheduled(cron = "0 0/30 * * * ?")public void pushMessageAllClients() {logger.info("开始-------->pushMessageAllClients...{}",System.currentTimeMillis());clientMap.forEach((address, client)->{Object object = UserInfoMapUtil.get(address);logger.info("用户信息...{}",String.valueOf(object));String message = sysMessage(String.valueOf(object));client.sendEvent("accept_response", message);logger.info("sendEvent:{}",client);});}public static Map<String, SocketIOClient> getClientMap() {return clientMap;}public static void setClientMap(Map<String, SocketIOClient> clientMap) {SocketIoServer.clientMap = clientMap;}}

spring boot 集成socketIo 做消息推送相关推荐

  1. Spring Boot 实现企业微信消息推送

    1 Maven依赖 <!-- 阿里JSON解析器 --><dependency><groupId>com.alibaba</groupId><ar ...

  2. Spring Boot 集成 WebSocket通信信息推送!

    一.什么是websocket? WebSocket 协议是基于 TCP 的一种新的网络协议. 它实现了客户端与服务器之间的全双工通信,学过计算机网络都知道,既然是全双工,就说明了服务器可以主动发送信息 ...

  3. 做消息推送 8 年的极光,为何做物联网 JIoT 平台?

    作者 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 在移动开发里,开发者有三大刚需:统计分析.消息推送.统一登录.其中对于消息推送,有一家企业自移动开发的潮流伊始,便坚持为开发者提供这项基 ...

  4. 使用dwr3.0实现服务端向浏览器做消息推送,做滚动评论或弹幕效果,而且根据视频id做推送消息拦截功能

    最近项目要实现视频播放时做弹幕和评论滚动,使用flash做sockt编程不会,就想到使用服务器消息推送做,翻找资料发现使用html5的websocket可以实现,但是ie8是不支持websocket的 ...

  5. spring boot 集成 websocket 实现消息主动推送

    前言 http协议是无状态协议,每次请求都不知道前面发生了什么,而且只可以由浏览器端请求服务器端,而不能由服务器去主动通知浏览器端,是单向的,在很多场景就不适合,比如实时的推送,消息通知或者股票等信息 ...

  6. Springboot集成websocket实现消息推送和在线用户统计

    一.HTTP 说到websocket首先要说Http,Http大家都知道是一个网络通信协议,每当客户端浏览器需要访问后台时都会发一个请求,服务器给出响应后该连接就会关闭,请求只能有客户端发起,服务端是 ...

  7. uniapp+极光做消息推送

    这里写自定义目录标题 登录[极光官网](https://www.jiguang.cn/) 二.安装和配置uniapp极光插件 三.编写代码 四.调试运行 自定义基座完成后,会在项目的unpackage ...

  8. spring集成mina 实现消息推送以及转发

    spring集成mina: 在学习mina这块时,在网上找了很多资料,只有一些demo,只能实现客户端向服务端发送消息.建立长连接之类.但是实际上在项目中,并不简单实现这些,还有业务逻辑之类的处理以及 ...

  9. Spring clound+VUE+WebSocket实现消息推送 一(即时通讯)

    需求: 当用户进行某个操作,需要通知其他用户时,其他用户可以实时接收消息. 工程为 Spring cloud + VUE . 技术实现: Spring Cloud.Spring boot.vue.we ...

最新文章

  1. 框架之一:mybatis
  2. 定制AjaxControlToolkit:给CalendarExtender增加清除功能
  3. 解决Ubuntu17.04不能安装git的问题 E: Package 'git' has no installation candidate
  4. 图解系列之垃圾收集标记整理算法
  5. android图片的缩放、圆角处理
  6. docker es持久化_Docker 搭建 ES 集群并整合 Spring Boot
  7. linux cd 一些用法
  8. idea抽取重复方法快捷键_使用 IDEA 几分钟就重构了同事800 行quot;又臭又长quot; 的类!真香!...
  9. HDU 5701:中位数计数
  10. sap成本流怎么看_SAP FICO成本结算的流程到底是怎样的?
  11. C++ OpenCV 学习笔记【0】- 未整理,草稿记录用
  12. html图书借阅源码,图书借阅管理系统代码图书管理系统源代码
  13. 多媒体计算机技术未来的发展方向,多媒体技术的发展现状及未来
  14. FDM3D打印技术原理简析
  15. Elasticsearch和Spring Data Elasticsearch版本对应
  16. 程序员讨论《黑客帝国》(一)真实与虚拟
  17. python opencv 读取mov文件
  18. 《2021中国开源发展蓝皮书》发布——中国开源接近世界先进水平
  19. 『深度应用』NLP机器翻译深度学习实战课程·零(基础概念)
  20. SUMIF 和 SUMIFS

热门文章

  1. AT89C52流水灯+外部中断INT0+定时器(汇编语言)
  2. 12306 Android客户端的libcheckcode.so解密及修复
  3. 微信公众号朋友圈压力测试
  4. Linux系统恢复U盘数据,分享|恢复崩溃计算机数据的五款最佳 Linux 发行版
  5. VMD确定分解个数K
  6. 2015Robocup --机器人世界杯(合肥)
  7. 数控加工中产品粗糙度的缺陷产生原因与排除方法
  8. 树莓派安装ubuntu18.04
  9. JOB:前端面试10
  10. 一路走来CCNA,写在CCNA培训结束时