我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot+netty-socketio如何实现服务器端消息推送

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot+netty-socketio如何实现服务器端消息推送

这篇文章主要介绍SpringBoot+netty-socketio如何实现服务器端消息推送,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

首先:因为工作需要,需要对接socket.io框架对接,所以目前只能使用netty-socketio。websocket是不支持对接socket.io框架的。

netty-socketio顾名思义他是一个底层基于netty'实现的socket。

在springboot项目中的集成,请看下面的代码

maven依赖

<dependency> <groupId>com.corundumstudio.socketio</groupId> <artifactId>netty-socketio</artifactId> <version>1.7.11</version></dependency>

 下面就是代码了

首先是配置参数

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

上面的注释写的很清楚。下面是config代码

import com.corundumstudio.socketio.Configuration;import com.corundumstudio.socketio.SocketConfig;import com.corundumstudio.socketio.SocketIOServer;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import javax.annotation.Resource;@Componentpublic class PushServer implements InitializingBean {  @Autowired  private EventListenner eventListenner;  @Value("${socketio.port}")  private int serverPort;  @Value("${socketio.host}")  private String serverHost;  @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;  @Override  public void afterPropertiesSet() throws Exception {    Configuration config = new Configuration();    config.setPort(serverPort);    config.setHostname(serverHost);    config.setBossThreads(bossCount);    config.setWorkerThreads(workCount);    config.setAllowCustomRequests(allowCustomRequests);    config.setUpgradeTimeout(upgradeTimeout);    config.setPingTimeout(pingTimeout);    config.setPingInterval(pingInterval);    SocketConfig socketConfig = new SocketConfig();    socketConfig.setReuseAddress(true);    socketConfig.setTcpNoDelay(true);    socketConfig.setSoLinger(0);    config.setSocketConfig(socketConfig);    SocketIOServer server = new SocketIOServer(config);    server.addListeners(eventListenner);    server.start();    System.out.println("启动正常");  }}

在就是监听代码

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 org.apache.commons.lang3.StringUtils;import org.bangying.auth.JwtSupport;import org.springframework.stereotype.Component;import javax.annotation.Resource;import java.util.UUID;@Componentpublic class EventListenner {  @Resource  private ClientCache clientCache;  @Resource  private JwtSupport jwtSupport;    @OnConnect  public void onConnect(SocketIOClient client) {    String userId = client.getHandshakeData().getSingleUrlParam("userId");//    userId = jwtSupport.getApplicationUser().getId().toString();//    userId = "8";    UUID sessionId = client.getSessionId();    clientCache.saveClient(userId, sessionId, client);    System.out.println("建立连接");  }    @OnDisconnect  public void onDisconnect(SocketIOClient client) {    String userId = client.getHandshakeData().getSingleUrlParam("userId");    if (StringUtils.isNotBlank(userId)) {      clientCache.deleteSessionClient(userId, client.getSessionId());      System.out.println("关闭连接");    }  }  //消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息  // 暂未使用  @OnEvent("messageevent")  public void onEvent(SocketIOClient client, AckRequest request) {  }}

本地缓存信息

import com.corundumstudio.socketio.SocketIOClient;import org.apache.commons.lang3.StringUtils;import org.springframework.stereotype.Component;import java.util.HashMap;import java.util.Map;import java.util.UUID;import java.util.concurrent.ConcurrentHashMap;@Componentpublic class ClientCache {  //本地缓存  private static Map<String, HashMap<UUID, SocketIOClient>> concurrentHashMap=new ConcurrentHashMap<>();    public void saveClient(String userId, UUID sessionId,SocketIOClient socketIOClient){    if(StringUtils.isNotBlank(userId)){      HashMap<UUID, SocketIOClient> sessionIdClientCache=concurrentHashMap.get(userId);      if(sessionIdClientCache==null){        sessionIdClientCache = new HashMap<>();      }      sessionIdClientCache.put(sessionId,socketIOClient);      concurrentHashMap.put(userId,sessionIdClientCache);    }  }    public HashMap<UUID, SocketIOClient> getUserClient(String userId){    return concurrentHashMap.get(userId);  }    public void deleteSessionClient(String userId,UUID sessionId){    concurrentHashMap.get(userId).remove(sessionId);  }}

下面是存储客户端连接信息

import com.corundumstudio.socketio.SocketIOClient;import org.apache.commons.lang3.StringUtils;import org.springframework.stereotype.Component;import java.util.HashMap;import java.util.Map;import java.util.UUID;import java.util.concurrent.ConcurrentHashMap;@Componentpublic class ClientCache {  //本地缓存  private static Map<String, HashMap<UUID, SocketIOClient>> concurrentHashMap=new ConcurrentHashMap<>();    public void saveClient(String userId, UUID sessionId,SocketIOClient socketIOClient){    if(StringUtils.isNotBlank(userId)){      HashMap<UUID, SocketIOClient> sessionIdClientCache=concurrentHashMap.get(userId);      if(sessionIdClientCache==null){        sessionIdClientCache = new HashMap<>();      }      sessionIdClientCache.put(sessionId,socketIOClient);      concurrentHashMap.put(userId,sessionIdClientCache);    }  }    public HashMap<UUID, SocketIOClient> getUserClient(String userId){    return concurrentHashMap.get(userId);  }    public void deleteSessionClient(String userId,UUID sessionId){    concurrentHashMap.get(userId).remove(sessionId);  }}

控制层推送方法

@RestController@RequestMapping("/push")public class PushController {  @Resource  private ClientCache clientCache;  @Autowired  private JwtSupport jwtSupport;  @GetMapping("/message")  public String pushTuUser(@Param("id") String id){    Integer userId = jwtSupport.getApplicationUser().getId();    HashMap<UUID, SocketIOClient> userClient = clientCache.getUserClient(String.valueOf(userId));    userClient.forEach((uuid, socketIOClient) -> {      //向客户端推送消息      socketIOClient.sendEvent("chatevent","服务端推送消息");    });    return "success";  }}

以上是“SpringBoot+netty-socketio如何实现服务器端消息推送”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot+netty-socketio如何实现服务器端消息推送

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot+netty-socketio如何实现服务器端消息推送

这篇文章主要介绍SpringBoot+netty-socketio如何实现服务器端消息推送,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先:因为工作需要,需要对接socket.io框架对接,所以目前只能使用nett
2023-06-14

WebSocket如何实现服务器消息推送客户端

这篇文章主要为大家展示了“WebSocket如何实现服务器消息推送客户端”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“WebSocket如何实现服务器消息推送客户端”这篇文章吧。  一、背景  
2023-06-02

如何使用Java 11 HTTP Client API实现HTTP/2服务器推送

这篇文章将为大家详细讲解有关如何使用Java 11 HTTP Client API实现HTTP/2服务器推送,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。对 HttpUrlConnection 你还有印象
2023-06-02

如何利用WCF实现将服务器端的错误信息返回

本篇内容主要讲解“如何利用WCF实现将服务器端的错误信息返回”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用WCF实现将服务器端的错误信息返回”吧!最近在园子里转看到有人对如题的实现有疑问
2023-06-17

编程热搜

目录