简记 socketio使用

1.maven引入

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

2.配置application.yml文件

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

3.定义socket io config

@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.yml中* @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);config.setBossThreads(bossCount);config.setWorkerThreads(workCount);config.setAllowCustomRequests(allowCustomRequests);config.setUpgradeTimeout(upgradeTimeout);config.setPingTimeout(pingTimeout);config.setPingInterval(pingInterval);return new SocketIOServer(config);}
}
4.SocketIOService
public interface SocketIOService {//推送的事件public static final String PUSH_EVENT = "push_event";// 启动服务void start() throws Exception;// 停止服务void stop();// 推送信息void pushMessageToUser(PushMessage pushMessage);// 推送信息给所有人void pushMessageToUserAll(PushMessage pushMessage);

5.实现类

@Service(value = "socketIOService")
public class SocketIOServiceImpl implements SocketIOService {// 用来存已连接的客户端private static Map<String, SocketIOClient> clientMap = new ConcurrentHashMap<>();@Autowiredprivate SocketIOServer socketIOServer;/*** Spring IoC容器创建之后,在加载SocketIOServiceImpl Bean之后启动* @throws Exception*/@PostConstructprivate void autoStartup() throws Exception {start();}/*** Spring IoC容器在销毁SocketIOServiceImpl Bean之前关闭,避免重启项目服务端口占用问题* @throws Exception*/@PreDestroyprivate void autoStop() throws Exception  {stop();}//@CrossOrigin(value = "*", maxAge = 3600)@Overridepublic void start() {// 监听客户端连接socketIOServer.addConnectListener(client -> {String loginUserNum = getParamsByClient(client);System.out.println("loginUserNum-------------------------"+loginUserNum);if (loginUserNum != null) {clientMap.put(loginUserNum, client);}});// 监听客户端断开连接socketIOServer.addDisconnectListener(client -> {String loginUserNum = getParamsByClient(client);if (loginUserNum != null) {clientMap.remove(loginUserNum);client.disconnect();}});// 处理自定义的事件,与连接监听类似socketIOServer.addEventListener(PUSH_EVENT, PushMessage.class, (client, data, ackSender) -> {// TODO do something});socketIOServer.start();}@Overridepublic void stop() {if (socketIOServer != null) {socketIOServer.stop();socketIOServer = null;}}@Overridepublic void pushMessageToUser(PushMessage pushMessage) {String loginUserNum = pushMessage.getLoginUserNum().toString();if (StringUtils.isNotBlank(loginUserNum)) {SocketIOClient client = clientMap.get(loginUserNum);if (client != null) {client.sendEvent(pushMessage.getType(), pushMessage);}}}@Overridepublic void pushMessageToUserAll(PushMessage pushMessage) {// 获取全部客户端Collection<SocketIOClient> allClients = socketIOServer.getAllClients();for( SocketIOClient socket : allClients ) {socket.sendEvent( pushMessage.getType(), pushMessage );}}/*** 此方法为获取client连接中的参数,可根据需求更改* @param client* @return*/private String getParamsByClient(SocketIOClient client) {// 从请求的连接中拿出参数(这里的loginUserNum必须是唯一标识)Map<String, List<String>> params = client.getHandshakeData().getUrlParams();List<String> list = params.get("loginUserNum");if (list != null && list.size() > 0) {return list.get(0);}return null;}
}

6.使用

 @Autowiredprivate SocketIOService socketIOService;public void sendState(String userId) {PushMessage p=new PushMessage();p.setLoginUserNum(userId);p.setContent("success");p.setType("stateChange");p.setFlag(true);socketIOService.pushMessageToUserAll(p);}

socketio使用相关推荐

  1. Nginx与websocket或socketio的负载均衡

    前言 在之前写过使用socketio来实时向用户推送站内信springboot使用netty-socketio推送消息,在前天上线时遇到了一个问题,后端在生产上启动了,消息也能启动,但是前段页面是直接 ...

  2. webscoket绑定php uid,Think-Swoole之WebSocket客户端消息解析与使用SocketIO处理用户UID与fd关联...

    WebSocket 客户端消息的解析 前面我们演示了当客户端连接服务端,会触发连接事件,事件中我们要求返回当前客户端的 fd.当客户端发送消息给服务端,服务端会根据我们的规则将消息发送给指定 fd 的 ...

  3. 非常完整的coco screator socketio

    https://github.com/SeaPlanet/cocoscreator_chat 前端源码 https://github.com/socketio/socket.io-client htt ...

  4. python socketio async client_electron/socket.io client-python socketio/aiohttp server//连接失败

    此websocket连接失败.有趣的是这几天前还在起作用.我把电子从6降到了5.0.6,但这没用. 服务器 from aiohttp import web import socketio app = ...

  5. socket接收的消息怎么更新到页面_利用socketio实现简易即时消息服务

    背景简介 以前开发HTTP服务器更多使用的是python语言中的Flask框架来完成,但是在最近的业务中涉及到在web页面中实时获取消息更新,这个时候我能想到的解决方案 1.写一个循环ajax请求,不 ...

  6. socketio mysql_socket.io 在java与微信小程序上的应用

    最近有一个这样的功能场景.用户操作完成后.服务器主动通知另一个客户端显示结果. 这里涉及一个服务器推的这么一个东西.需要实现这么一个功能,对比了几个实现方式.最终选择了socket.io. 1.com ...

  7. socketio mysql_Golang + Socket.io

    在 Go 中使用 Socket.IO Websocket Websocket是全双工的基于TCP层的通信协议,为浏览器及网站服务器提供处理流式推送消息的方式.它不同于HTTP协议,但仍依赖HTTP的U ...

  8. Nginx + uWSGI + flask + socketio 部署解决方案

    Nginx + uWSGI + flask + socketio 部署解决方案 参考文章: (1)Nginx + uWSGI + flask + socketio 部署解决方案 (2)https:// ...

  9. AttributeError: module 'socketio' has no attribute 'Server'

    Anaconda 3 + Python 3.5 + Windows 10 在Python中运行程序时出现如题所示的报错,错误提示上说问题出在这句代码上: sio = socketio.Server() ...

  10. flask+socketio+echarts3 服务器监控程序(基于后端数据推送)

    本文地址:http://www.cnblogs.com/hhh5460/p/7397006.html 说明 以前的那个例子的思路是后端监控数据存入数据库:前端ajax定时查询数据库. 这几天在看web ...

最新文章

  1. java servlet 请求_Java中前台JSP请求Servlet实例(http+Servlet)
  2. 如何使用Worktile进行敏捷项目开发管理
  3. ssr面板_碧蓝航线:详解SSR里诺强不强 航母专用保姆 三流防空特化型轻巡
  4. 如何在windows下安装cygwin
  5. shell 取中间行的第一列_shell脚本的使用该熟练起来了,你说呢?(篇三)
  6. 一级计算机word试题及答案,计算机一级考试试题及答案Word文档..doc
  7. 他来阿里 4 年,刻苦奋斗、稳扎稳打终于爬到 P7 ,他说一定要感谢这几个公众号的指导!...
  8. Elasticsearch查询性能优化
  9. Qt工作笔记-仿QQ登录界面(换肤,切换语言)
  10. 95-230-010-源码-WordCount走读-概述
  11. 【Cocos2d-X开发学习笔记】第05期:渲染框架之布景层类(CCLayer)的使用
  12. 3.c语言结构体成员内存对齐详解
  13. 反病毒软件技术简析与探索(2009年5月18日)
  14. 转载--numpy中的ravel()、flatten()、squeeze()的用法与区别
  15. mapxtreme2008 7.0错误
  16. 我们该怎么把图片转文字呢?智能提取文字软件有哪些?
  17. windows 控制台cmd乱码的解决办法 chcp 65001
  18. 如何做一个本地漫画党:了解漫画+下载漫画+漫画APP推荐
  19. 关于“2021中国隧道与地下空间大会暨中国(城市)地下空间学会(筹)成立大会”的通知
  20. IT培训机构那些让人恶心的招生手法

热门文章

  1. 如何看待:Oracle Java SE 8 发行版更新 ? --- 变向激励学习 JDK 10 吗?
  2. PAT乙级 1012 数字分类 (20 分)
  3. k8s之存储抽象nfs挂载
  4. iOS WKWebView加载本地文件之权威解说
  5. “中国式支付”在全球成功逆袭
  6. 400w人在抖音学驾照科目一,给我看哭了……用Python这不一下整活了吗
  7. erp沙盘采购总监的心得_ERP沙盘推演实训心得——采购总监
  8. sap委外退料流程图_委外退料单
  9. abp的application service形成的restful api 和nswagger的集成时, 返回值为null
  10. 高级商业数字营销师题库