java socketio server 端 笔记

项目需要做web端实时推送 引用了socketio来实现,今天做下笔记
需要的jar
socketio.jar
以下是socketio.jar依赖的jar包
[img]http://dl2.iteye.com/upload/attachment/0108/8120/c4a885d4-16fb-3eda-820f-2fe1a24addff.jpg[/img]




import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;

import org.apache.commons.lang.StringUtils;

import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.ConnectListener;
import com.corundumstudio.socketio.listener.DataListener;
import com.corundumstudio.socketio.listener.DisconnectListener;
import com.wafer.cloud.task.model.RegInfo;
import com.wafer.cloud.task.model.SocketDataObj;

/**
*
* @author Chunf
*
* @Time 2015年5月22日
*/
public class SocketioServer implements Runnable {

//静态消息列表,SocketDataObj实体类 userid,message getter&setter
private static LinkedList<SocketDataObj> msgList = new LinkedList<SocketDataObj>();
//server配置容器
private static Configuration conf = null;
//server已配置标识
private static boolean conf_flag = false;
//server已启动标识
private static boolean server_flag = false;
//server
private static SocketIOServer server = null;
//客户端暂存
private static HashMap<String, SocketIOClient> client_cache = new HashMap<String, SocketIOClient>();
//用户客户端关系暂存
private static HashMap<UUID,String> user_client_cache = new HashMap<UUID,String>();

//构造器
public SocketioServer(List<SocketDataObj> list) {
if (!list.isEmpty()) {
synchronized (msgList) {
for (SocketDataObj s : list) {
SocketioServer.msgList.add(s);
msgList.notify(); //当有新的数据放入时,释放锁
}
}
}
}

//线程执行器
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {//打开线程
synchronized (msgList) { //获取锁
if (!server_flag) {
this.getConfig();
server = new SocketIOServer(conf);
this.startServer();
}
if (!msgList.isEmpty()) { //如果消息列表有数据,则需要推送
SocketDataObj sdo = msgList.getFirst();
String userid = sdo.getUserid();
SocketIOClient client = client_cache.get(userid);
if (client != null) {
client.sendEvent("msg", sdo.getMessage());
msgList.removeFirst();
}
} else {
try {
msgList.wait(); //如果消息列表无数据则wait 保持线程
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

//生成配置容器
private void getConfig() {
if (!conf_flag) {
conf = new Configuration();
try {
String hostName = PropertiesReader.getValByKey("socketioIp");
String port = PropertiesReader.getValByKey("socketPort");
if (hostName != null && !StringUtils.isEmpty(hostName)
&& port != null && !StringUtils.isEmpty(port)) {
conf.setHostname(hostName);
conf.setPort(Integer.parseInt(port));
conf_flag = true;
}
} catch (Exception e) {
try {
throw new Exception("获取配置信息出错!");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}

//启动server增加监听器
private void startServer() {
if (!server_flag) {
this.getConfig();
server.start();
server_flag = true;
server.addConnectListener(new ConnectListener() {
@Override
public void onConnect(SocketIOClient client) {
// TODO Auto-generated method stub
}
});

server.addDisconnectListener(new DisconnectListener() {
@Override
public void onDisconnect(SocketIOClient client) {
// TODO Auto-generated method stub
//根据客户端sessionID获取用户与client缓存中的信息
String userid = user_client_cache.get(client.getSessionId());
if(userid!=null){
if (client_cache.get(userid).getSessionId().equals(client.getSessionId())){ //如果当前缓存中的client就是断开的client
//清除当前信息
client_cache.remove(userid);
}
//清除关系缓存中的信息
user_client_cache.remove(client.getSessionId());
}
}
});

//增加regId监听,regId是与前台监听名对应一致的。当前台客户端连接上server后,向后台发送一个regId值,后台将这个值作为该客户端的唯一标识,并与client绑定存储
//regInfo实体类中只有一个属性就是userid + getter&setter
server.addEventListener("regId", RegInfo.class,
new DataListener<RegInfo>() {
//实现dataListener的回调
@Override
public void onData(SocketIOClient client, RegInfo data,
AckRequest ackSender) throws Exception {
// TODO Auto-generated method stub
//userid即为前台传到后台的regId
String userid = data.getUserID();
if (userid != null
&& StringUtils.isNotEmpty(userid)) {
//由于一个客户端是外部轮询的,所以一直在变化
//在客户端缓存中清除原有属于该userid的客户端
client_cache.remove(userid);
//增加新的客户端
client_cache.put(userid, client);
//向用户与客户端存储中存入新的client
user_client_cache.put(client.getSessionId(), userid);
client.sendEvent("regOK", data);
System.out.println("注册成功!key=" + userid);
}
}

});
}
}

@SuppressWarnings("unused")
private void stopServer() {
if (server_flag) {
server.stop();
server_flag = false;
}
}
}


如果用cache作为暂存 效果更佳!
socket.io-server-java:Java的Socket.IO服务器库 Socket.IO Java 这是从移植的Java Socket.IO服务器库。 注意此库将遵循从版本3开始的JS库的主要版本。 另请参见: 特征 该库支持JS服务器执行的所有功能,包括事件,选项和升级传输。 文献资料 完整的文档可以在找到。 安装 最新的工件在Maven Central上可用。 玛文 将以下依赖项添加到pom.xml 。 < dependencies> < dependency> < groupId>io.socket</ groupId> < artifactId>socket.io-server</ artifactId> < version>3.0.1</ version> </ dependency> </ dependencies> Gradle 将其作为gradle依赖项添加到build.gradl 立即下载

相关推荐

麒麟系统grub被锁怎么办?双密码遗忘救援指南(实测V10 SP3版本)

本文详细介绍了麒麟系统V10 SP3版本在GRUB和root密码双遗忘情况下的救援指南。通过ISO镜像进入救援模式,结合单用户模式操作,实现密码重置与系统权限恢复,特别适用于等保合规环境。

391

唤醒手腕 Java 后端 Springboot 框架结合 socketio 学习笔记

该注解是 Java jdk 提供的注解,而不是 Spring 框架提供的, JavaEE5 引入了 @PostConstruct 和 @PreDestroy 两个作用于 Servlet 生命周期的注解,实现 Bean 初始化之前和销毁之前的自定义操作。Socket.IO是一个完全由JavaScript实现、基于Node.js、支持WebSocket的协议用于实时通信、跨平台的开源框架,它包括了客户端的JavaScript和服务器端的Node.js。该注解的方法在整个 Bean 初始化中的执行顺序。

唤醒手腕 1892

【数据分析/商业分析】面试题整理——SQL专题

数据分析\商业分析—面试题整理 自己总结的SQL类的面试题 文章目录数据分析\商业分析—面试题整理1.新增用户2.活跃用户数量3.连续登录4.次(n)日留存5.每个科目下分数最高的两名学生

awater_17的博客 1859

使用Java的IO/NIO处理网络编程:Socket、ServerSocket和NIO通道

需要注意的是,NIO是基于事件驱动的,可以使用Selector来监听多个通道的事件,以提高效率和扩展性。在Java中,可以使用Socket和ServerSocket类进行基于IO的网络编程,以及使用NIO(New IO)中的通道(Channel)进行基于NIO的网络编程。System.out.println("接收到服务器的响应:" + response.toString());无论是基于IO的网络编程还是基于NIO的网络编程,都需要注意资源的释放和异常处理,以确保程序的稳定性和可靠性。

m0_75198698的博客 928

构建高可用CephFS NFS网关:NFS-Ganesha与RADOS集群的深度整合

本文详细介绍了如何构建高可用的CephFS NFS网关,通过NFS-Ganesha与RADOS集群的深度整合,实现高效文件共享。文章涵盖核心架构、部署实战、性能调优及避坑指南,帮助用户解决Ceph客户端兼容性问题,提升存储访问效率。特别强调高可用设计,确保服务稳定性,适用于金融、电商等高要求场景。

weixin_26976635的博客 254

Frida实战:从adb连接到安卓设备参数加密Hook全流程解析

本文详细解析了使用Frida进行安卓应用动态分析的全流程。通过adb连接设备并部署Frida服务端,结合静态分析与动态Hook技术,精准定位并拦截关键函数,特别是针对参数加密等核心逻辑的实时监控与修改,为逆向分析与安全研究提供了高效实战方案。

weixin_29208077的博客 343

【亲测免费】 推荐开源项目:Socket.IO Java服务器端库

推荐开源项目:Socket.IO Java服务器端库 在现代Web开发中,实时通信已经成为许多应用程序的核心要求。这正是Socket.IO大展拳脚的地方,它提供了一种简单而强大的方式来实现实时双向通信。今天我们要向您推荐的是一个Java版本的Socket.IO服务器库,由trinopoty维护,与JavaScript原版兼容,并且支持所有主要特性。 1、项目介绍 Socket.IO Java是一个...

gitblog_00028的博客 694

Mac新手必看:nvm安装全攻略(含常见错误解决方案)

本文为Mac开发者提供nvm安装与使用全攻略,涵盖环境准备、安装步骤、Shell配置优化及常见错误解决方案。详细讲解如何利用nvm管理多Node版本,提升开发效率,特别针对国内用户提供网络问题解决技巧,是Mac新手必备的Node版本管理指南。

weixin_28839699的博客 1621

Java IO学习笔记四:Socket基础

启动三个客户端连接这个服务端, 然后再服务端执行netstat -ntap。内核已经为客户端和服务端建立了连接并完成了三次握手,在服务端使用。超过了服务端设置的最大连接数,服务端就不再继续向客户端发送报文。文件描述符6u就对应了服务端和客户端连接的一个Socket。在创建服务端的时候,我们指定了一个参数:backlog=2。服务端收到报文后,向客户端发送确认的报文,服务端进入。在具体的编程中,服务端和客户端都有很多配置的参数。无法执行,即:服务端此时是无法接收客户端的。方法,导致服务端其实没办法执行。

Practitioner 319

基于深度学习的农作物病虫害检测识别系统:YOLOv8 + UI界面 + 数据集

该系统的目标是使用YOLOv8模型自动检测农作物的病虫害,并通过UI界面提供实时反馈。用户可以通过上传图像,系统会输出图像中是否存在病虫害以及具体种类。数据集准备与处理:收集并准备包含农作物病虫害图像的数据集,并进行标注和数据增强。YOLOv8模型训练:使用YOLOv8训练农作物病虫害检测模型。UI界面设计与开发:开发一个用户友好的界面,支持上传图像并展示检测结果。系统测试与优化:评估模型的准确性、实时性,并对系统进行优化。

YOLO 884

YOLOv11涨点改进| TGRS 2026 | 独家创新首发、特征融合改进篇| 引入STSAM协同时空注意力融合模块,发论文热点创新,注意力能够互相引导强化边界和结构细节,增强目标检测、图像分割涨点

🔥本文提出了一种改进YOLOv11网络模型的STSAM协同时空注意力融合模块,用于提升高分辨率遥感变化检测的精度。STSAM通过并行处理全局跨时相注意力和局部坐标注意力,能有效聚焦真实变化目标,强化边界和结构细节。该模块包含两个分支:Cross-Attention分支通过时间嵌入增强双时相特征的时间差异,CoordAtt分支则强化局部结构细节。实验表明,STSAM能显著提升变化检测性能,同时保持训练稳定性。文章详细介绍了模块结构、原理、优势,并提供了完整的核心代码实现和配置方法,包括三种改进方案。

Ai缝合怪、助力小伙伴高效发论文 218

java使用socket.io进行web实时通讯 netty-socketio

服务端JAVA 创建一个spring boot项目 在pom.xml中加入netty-socketio和fastjson <dependency> <groupId>com.corundumstudio.socketio</groupId> <artifactId>netty-socketio</artifactId> <...

一个抠得儿 1万+

AgentScope Java 入门:Spring AI Alibaba 与 AgentScope 的定位与区别

摘要:Spring AI Alibaba是阿里基于Spring AI开发的本地化AI应用框架,旨在服务Java开发者。它提供模型接入、函数调用、RAG等功能,并与阿里云基础设施深度集成。同时,阿里开源了多智能体框架AgentScope,其Java版(AgentScope-Java)专注于Agentic设计理念。两者将协同发展:Spring AI Alibaba侧重Spring生态集成,AgentScope-Java强化智能体能力。未来计划包括支持AgentScope、升级Admin平台,以及推进Server

SmartSi 1549

socketio mysql_socketio server推送

假设面试官问你:要把server端的数据时时显示在浏览器上怎么实现?我想有非常多人会回答使用Ajax技术定时去訪问一个资源,没错,使用Ajax的确能实现。但面试官要的绝对不是这个答案。由于使用Ajax频繁訪问给服务端造成太大的压力,所以在大部分情况下都是不取的。面试官想要的答案应该是将server端的数据推送至浏览器,这样仅仅须要保持一个长链接就能够了。socket.io就能实现数据的时时推送,s...

weixin_29497751的博客 351

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

socketio server推送

   假设面试官问你:要把server端的数据时时显示在浏览器上怎么实现?我想有非常多人会回答使用Ajax技术定时去訪问一个资源,没错,使用Ajax的确能实现。但面试官要的绝对不是这个答案。由于使用Ajax频繁訪问给服务端造成太大的压力,所以在大部分情况下都是不取的。面试官想要的答案应该是将server端的数据推送至浏览器,这样仅仅须要保持一个长链接就能够了。 socket.io...

weixin_34277853的博客 1495

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

基于netty-socketio的web推送服务

实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现。传统的web服务都是客户端发出请求,服务端给出响应。但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推送消息到客户端。 有哪些可以实现web消息推送的技术: 不断地轮询(俗称“拉”,polling)是获取实时消息的一个手段:Ajax 隔一段时间(通常使用 JavaScript 的 setTim...

CharlesYooSky的博客 879

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

用socketio做web系统在线用户量统计,和消息提醒

一开始想用session监听器,不过有过期时间,并非实事。而且,如果不用jsp,就需要写个rest服务,供前段轮询调用接口,比如5秒一次,来刷新在线人数。影响性能。后来想到用WebSocket来做。刚好之前有用过socketio来推送消息,于是敲定方案。 我使用的是开源库,https://github.com/mrniko/netty-socketio, 有近3000个star,还是不...

weixin_30834019的博客 320

spring boot 集成socketIo 做消息推送

spring boot集成socketIO 消息推送

crazyda的博客 1169

socket.io服务端是java_基于netty-socketio的web推送服务

实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现。传统的web服务都是客户端发出请求,服务端给出响应。但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推送消息到客户端。有哪些可以实现web消息推送的技术:不断地轮询(俗称“拉”,polling)是获取实时消息的一个手段:Ajax 隔一段时间(通常使用 JavaScript 的 setTimeout 函...

weixin_39564807的博客 902

socket.io netty java,Java中的SocketIO Client,如何实现与netty-socketio Server一起工作?

for a practical course at university, I have to write a little game in Java, with a client/server infrastructure. I need to use Websockets for communication, and other students, whose solutions must b...

weixin_33510623的博客 361

Spring Boot使用Netty SocketIO实现WebIM功能

Netty SocketIO是一个 Java 语言版本的Socket.IO服务器的实现,基于Netty框架开发,使用简单,功能强大。 在Spring Boot中包含了对Netty SocketIO的支持,只需要简单配置即可加入。 第一步:增加Netty SocketIO的依赖。 <dependency> <groupId>com.corundums...

weixin_40954729的博客 341

Netty-SocketIO的Web推送实战应用

netty-socketio是一个开源的Socket.io服务器端的一个java的实现, 它基于Netty框架。可应用于服务端主动推送消息到客户端等场景,比如说股票价格变化、k线图的走势,和websocket是一个作用,只不过socketio可支持所有的浏览器。 项目地址为: https://github.com/mrniko/netty-socketio。 Socket.IO除了支持Web

灵思致远Leansmall的博客 1552

构建实时Web的JAVA选择组合:socket.io client + socketio-netty server

构建实时Web的JAVA选择组合:socket.io client + socketio-netty server 前言 现在一说到实时web,可能大家不由自主的就想到了node.js,确实,在语言级别node.js实现了异步的、基于事件机制的IO特性,使用简单。在JAVA语言层面,提供了NIO作为非阻塞IO的替代品。无论node.js还是JAVA,都没有从真正意义上实现AIO(这个需

那个谁的空间 1万+

【SocketIO】笔记

本身有serve这个js翻看源代码我们会发现,在 1.2.0 版本的 socket.io 中,的 /lib/index.js 中,有这样一段代码:Server.prototype.attachServe = function(srv){ debug('attaching client serving req handler'); var url = this._path + '/socke

greatbody的专栏 876

用socketio做web系统在线用户量统计

一开始想用session监听器,不过有过期时间,并非实事。而且,如果不用jsp,就需要写个rest服务,供前段轮询调用接口,比如5秒一次,来刷新在线人数。影响性能。后来想到用WebSocket来做。刚好之前有用过socketio来推送消息,于是敲定方案。 我使用的是开源库,https://github.com/mrniko/netty-socketio, 有近3000个star,还是不错的。 ...

cqu_sgv5的专栏 5448
上一篇: 简单的线程池
下一篇: httpclient 工具类
vortex331
博客等级 码龄16年 0粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值