前言

本文基于SpringBoot2.2.6, 集成netty-socketio

依赖

<dependency><groupId>com.corundumstudio.socketio</groupId><artifactId>netty-socketio</artifactId><version>1.7.7</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.4</version>
</dependency>

配置文件

socketio:host: 127.0.0.1 #监听的ipport: 10246       #监听端口# 设置最大每帧处理数据的长度,防止他人利用大数据来攻击服务器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

配置

package com.zhbcm.socketio.config;import com.corundumstudio.socketio.SocketConfig;
import com.corundumstudio.socketio.SocketIOServer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author 朝花不迟暮* @version 1.0* @date 2021/6/18 20:23*/
@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);config.setBossThreads(bossCount);config.setWorkerThreads(workCount);config.setAllowCustomRequests(allowCustomRequests);config.setUpgradeTimeout(upgradeTimeout);config.setPingTimeout(pingTimeout);config.setPingInterval(pingInterval);return new SocketIOServer(config);}
}

SocketIoService

import com.alibaba.fastjson.JSONObject;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** @author 朝花不迟暮* @version 1.0* @date 2021/6/18 20:25*/
@Service
public class SocketIoService
{private final Logger log = LoggerFactory.getLogger(this.getClass());// 用来存已连接的客户端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();}public void start(){// 监听客户端连接socketIOServer.addConnectListener(client -> {String uid = getParamsByClient(client);if (uid != null){clientMap.put(uid, client);log.info("有新的客户端连接UID:{}", uid);}// 给客户端发送一条信息 发送ClientReceive事件 需要客户端绑定此事件即可接收到消息JSONObject jsonObject = new JSONObject();jsonObject.put("name", "goat");jsonObject.put("message", "hello client");client.sendEvent("ClientReceive", jsonObject);});// 监听客户端断开连接socketIOServer.addDisconnectListener(listener -> {String uid = getParamsByClient(listener);if (uid != null){clientMap.remove(uid);listener.disconnect();log.info("一条客户端连接中断");}});socketIOServer.addEventListener("ServerReceive", JSONObject.class, (client, data, ackSender) -> {String uid = getParamsByClient(client);String ip = getIpByClient(client);if (uid != null){log.info("接收到SID:{}发来的消息:{}", uid, data.toJSONString());log.debug(ip + " ************ 客户端:" + data);}});socketIOServer.start();log.info("socket.io初始化服务完成");}public void stop(){if (socketIOServer != null){socketIOServer.stop();socketIOServer = null;}log.info("socket.io服务已关闭");}/*** 此方法为获取client连接中的参数,可根据需求更改** @param client* @return*/private String getParamsByClient(SocketIOClient client){// 从请求的连接中拿出参数(这里的sid必须是唯一标识)Map<String, List<String>> params = client.getHandshakeData().getUrlParams();List<String> list = params.get("UID");if (list != null && list.size() > 0){return list.get(0);}return null;}/*** 获取连接的客户端ip地址** @param client: 客户端* @return: java.lang.String*/private String getIpByClient(SocketIOClient client){String sa = client.getRemoteAddress().toString();return sa.substring(1, sa.indexOf(":"));}
}

客户端

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>客户端</title>
</head>
<body>
M
</body>
<script src="socket.io.js"></script>
<script type="text/javascript">const serverUri = "http://127.0.0.1:10246";const sendEvent = "ServerReceive";const receiveEvent = "ClientReceive";var socket;connect(1001);function connect(uid) {socket = io.connect(serverUri, {'force new connection': true,'query': 'UID=' + uid});socket.on('connect', function () {console.log("连接成功");//如果发送字符串send("hello Server"); *需要修改服务端接收类型send({name: "client",message: "hello Server"});});socket.on(receiveEvent, function (data) {console.log(data);});socket.on('disconnect', function () {console.log("连接断开");});}function send(data) {socket.emit(sendEvent, data);}
</script>
</html>

启动效果


连接成功:

服务端控制台

参考:
https://blog.csdn.net/m0_37603385/article/details/92798079
码云地址:https://gitee.com/thirtyleo/java_training_ground

Java集成socket.io相关推荐

  1. SpringBoot(23) 集成socket.io服务端和客户端实现通信

    一.前言 websocket和socket.io区别? websocket 一种让客户端和服务器之间能进行双向实时通信的技术 使用时,虽然主流浏览器都已经支持,但仍然可能有不兼容的情况 适合用于cli ...

  2. socket.io服务端是java_SpringBoot(23) 集成socket.io服务端和客户端实现通信

    @Slf4j @Service(value = "socketIOService") public class SocketIOServiceImpl implements ISo ...

  3. mac protobuf java_mac 下 使用 protobuf 生成 java 及 js 及配合socket.io 使用

    定义一个ProtoBuf源文件,gps_data.proto syntax = "proto3"; message gps_data { int64 id = 1; string ...

  4. java.sql.SQLException: Io 异常: Socket read timed out

    2010-07-20 12:02:23 错误 [con.err] java.sql.SQLException: Io 异常: Socket read timed out 2010-07-20 12:0 ...

  5. socket.io 在java与微信小程序上的应用

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

  6. Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 )

    Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 文章目录 Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 1.J ...

  7. java dwr和websocket_Websocket不是拯救世界的未来战士,那socket.io呢?

    今天在微博上看到朋友们在讨论关于各种web推送技术的话题,心里一阵唏嘘,触景生情,想想觉得自己还真是与这个叫做"web推送"的技术渊源颇深,有必要就这个话题唠叨两句,来回顾自己的青 ...

  8. h5 socket.io java,从HTML5 WebSocket到Socket.io

    HTML5 WebSocket 作为新一代的web标准,HTML5为我们提供了很多有用的东西,比如canvas,本地存储(已经分离出去了),多媒体编程接口,当然还有我们的WebSocket.WebSo ...

  9. 【Spring Boot】集成Netty Socket.IO通讯框架

    服务端 1 @Configuration 2 public class NettySocketConfig { 3 4 private static final Logger logger = Log ...

  10. socket.io java 点对点_netty-socket.io点对点通讯和聊天室通讯

    netty-socketio是基于netty的socket.io服务实现,可以无缝对接前端使用的socketio-client.js. 相对于javaee的原生websocket支持(@serverE ...

最新文章

  1. python写一个通讯录step by step V3.0
  2. Web应用主动侦测工具Skipfish
  3. Acwing第 1 场周赛【完结】
  4. 用JPA在测试的时候无法创建EntityManager Factory无法创建的几个可能因素!
  5. u-boot 源码分析讲解
  6. Unity3D 重写下拉菜单/Dropdown组件、开启每个按钮可用
  7. 利用 pywin32 操作 excel
  8. spring 导出csv_Spring批处理CSV处理
  9. 邱勇校长在2018级研究生开学典礼上的讲话 | 融合成就人生新的高度
  10. SOAP的Could not connect to host in...报错解决方案
  11. 2017.9.12 人员雇佣 失败总结
  12. 在linux中常用的shell备份脚本(波大帅哥)
  13. java 字符串 数字个数_JAVA 统计字符串中中文,英文,数字,空格的个数
  14. 【渝粤教育】国家开放大学2019年春季 242机械制图 参考试题
  15. 图书馆系统java实训报告_基于Java的图书馆管理系统的设计实习报告
  16. OverFeat 个人总结
  17. 卸载 vista sp1
  18. kubernetes CKA题库(附答案、视频)
  19. 可怕!Facebook 竟能识别出性工作者!你怎么看?
  20. (231)Verilog HDL:减法器

热门文章

  1. poi导出xlsx文件后,打开报“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决方法
  2. STL(标准模板库)
  3. RPM包安装卸载命令
  4. PS线条神器插件Lazy Nezumi Pro(能画出sai般的线条)
  5. 数据库系统——数据模型基本概念详解
  6. Mac苹果电脑怎么创建加密文件夹
  7. Box plot (箱线图) 解读以及Python实现
  8. 【mediasoup 带宽估计】aimd算法1 : AimdRateControl
  9. mac支持fat32格式吗 mac支持什么格式的移动硬盘
  10. STM32(7):中断方式让按键点亮LED