- 浏览: 66814 次
- 性别:
- 来自: 西安
最新评论
-
obj704:
想问一下这个程序中的 run函数是承担了主动向客户端推送的任务 ...
java socketio server 端 笔记 -
vortexchoo:
很久没管博客了,今天才看到,我试了一下,好着呢。。确定实体类中 ...
利用反射处理map 与 实体类的值映射 -
ddsdggsg:
成功了,,,,不知大哥改进没有,,,我这传日期类型数据处理报错 ...
利用反射处理map 与 实体类的值映射 -
ddsdggsg:
请问怎么调用呢?刚试验,,还没成功
利用反射处理map 与 实体类的值映射 -
quainter:
for(a;b;c){
d;
}
1.第一次循环先执 ...
java--for
项目需要做web端实时推送 引用了socketio来实现,今天做下笔记
需要的jar
socketio.jar
以下是socketio.jar依赖的jar包
如果用cache作为暂存 效果更佳!
需要的jar
socketio.jar
以下是socketio.jar依赖的jar包
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作为暂存 效果更佳!
发表评论
-
get req/resp in aspect
2018-11-27 09:24 372// HttpServletRequest req = ( ... -
Spring cloud
2018-04-17 16:26 448这个博客写的不错。 http://www.ityoukno ... -
设计模式
2017-02-28 15:45 334温习了一波java设计模式,没看完。把一些觉得比较经典的模式 ... -
compare local files and remote files.
2016-09-08 14:27 500最近发生了一件怪事,项目在本地run的时候会报一个jar包下 ... -
Servlet 3.0 使用request.part 处理文件上传
2016-08-26 14:14 767Servlet3.0 提供了比较简单的文件上传的api,今 ... -
不用其他jar包,获取随机排列数组。
2016-08-23 16:19 498/* * 网上看到一道题,挺有意思。记录下来。 */ ... -
简单的 threadlocal 模拟 及测试
2016-07-15 17:22 736package org.vic.demo.ThreadLo ... -
模拟简单的 spring component scan
2016-07-14 15:31 659/** * specified character ... -
线程池+队列
2016-04-06 10:40 542笔记:自己实现的线程池+队列。 package org.vi ... -
eclipse 使用
2015-12-14 11:23 487同事整理的,挂在这分享、备用。 -
基于ReentrantLock 队列笔记
2015-12-11 12:40 698package org.vic.queue.core; ... -
java序列化
2015-11-24 17:02 408今天有同事问我动态读写对象的问题,于是就想到了序列化。在此做 ... -
Spring AOP 用法笔记
2015-11-17 17:42 820最近工作不太忙,把spring aop又重新看了一遍,今天 ... -
JVM总结
2015-11-05 11:14 1075有人问我: 你平时 ... -
java反射-实体类转xml jar包
2015-10-23 14:31 878同上一篇一样,避免重复造车轮,写了这个jar包。 引入ja ... -
基于LinkedBlockQueue 的消息队列jar包
2015-10-22 15:58 1010为了让以后自己不再重复早轮子写的。 使用方法: ... -
线程的阻塞及唤醒
2015-10-15 18:01 640demo: 为方便展示,这里有两个类 : Taske ... -
自定义泛型的数组List
2015-10-09 10:12 714public class MyArrayList<T& ... -
HttpClient 模拟登录保持session并继续进行登录后操作
2015-09-08 13:05 8360公司考勤签到,每天都要登录系统签到,于是就在想:如果可以每 ... -
关闭流方法笔记
2015-09-01 09:19 675public class CloseHelper { ...
相关推荐
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
Java相关课程系列笔记之八JavaScript学习笔记(建议用WPS打开) Java相关课程系列笔记之二Oracle学习笔记(建议用WPS打开) Java相关课程系列笔记之九Servlet学习笔记(建议用WPS打开) Java相关课程系列笔记之六...
【标题】"java读书笔记笔记笔记笔记笔记笔记" 暗示了这是一份关于Java编程语言的学习笔记,可能包含了作者在阅读Java相关书籍时所做的重要记录和理解。笔记通常涵盖了语言的基础概念、核心特性、类与对象、内存管理...
Java相关课程系列笔记之一Java学习笔记 Java相关课程系列笔记之四JDBC学习笔记 Java相关课程系列笔记之六HTML学习笔记 Java相关课程系列笔记之七CSS学习笔记 Java相关课程系列笔记之八JavaScript学习笔记 Java相关...
Java全程笔记涵盖了从基础到进阶的广泛主题,旨在帮助学习者系统地理解和掌握Java编程语言,同时也涉及到了前端开发的相关知识。以下是对这些知识点的详细解析: 1. **Java基础知识**:这部分内容通常包括Java语言...
[奥莱理] Java 8 Lambdas 学习笔记 [奥莱理] Java 8 Lambdas 学习笔记 [奥莱理] Java 8 Lambdas 学习笔记 [奥莱理] Java 8 Lambdas 学习笔记 [奥莱理] Java 8 Lambdas 学习笔记 [奥莱理] Java 8 Lambdas 学习笔记 ...
【Java SSH Oracle SQLServer 学习笔记】 Java是一种广泛使用的面向对象的编程语言,它以其跨平台、开源和丰富的库而闻名。SSH是三个开源框架的缩写,分别是Spring、Struts和Hibernate,它们在Java Web开发中起着至...
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
Java JDK 7是Java开发工具包的一个重要版本,它的全称是Java Development Kit,是用于构建和运行Java应用程序的关键组件。这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些...
学习者可以通过这些笔记了解如何构建基于Java的服务器端应用。 最后,笔记可能还会提供一些实际项目案例,让学习者能够将理论知识应用到实践中,提升解决实际问题的能力。 总之,这份“达内Java_笔记整理.pdf”...
良葛格java jdk 5.0学习笔记,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip。
Java JDK 7学习笔记 此学习笔记适合初学者完成学习总结,加深理解 Java JDK 7学习笔记 此学习笔记适合初学者完成学习总结,加深理解
而将Java代码整理后存入有道云笔记的过程,既可以帮助开发者整理学习和工作中的代码,也能便于和其他开发者分享交流。 在这个过程中,首先需要使用一个能够处理和格式化代码的工具,如在线代码高亮工具,它能够将...
《Java JDK7学习笔记》是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习java时遇到的概念、操作、应用或认证考试等问题及解决方案。《Java JDK7学习笔记》针对java se 7新功能全面改版,无论是章节架构...
### ArcGIS Server 读书笔记知识点总结 #### 一、ArcGIS Server 概述 - **定义**:ArcGIS Server 是一款全面的企业级地理信息系统(GIS)服务器平台,它支持多种服务类型和技术标准,具备强大的空间数据管理和分析...
【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...
Java基础每日复习笔记-JavaSE高级阶段.edf
“尚硅谷JAVA基础笔记”涵盖了Java语言的基础知识,包括语言概述、基本语法、面向对象概念、封装、继承和多态,以及一些关键概念如形参与实参、属性与局部变量、构造器、this关键字、包和MVC设计模式的使用。...
"Java超强笔记"正是一份专为新手准备的学习资源,它全面涵盖了从Java环境的搭建到软件设计的各种概念,旨在提供一个易读且系统的学习路径。 首先,笔记可能会从Java的起源和发展开始介绍,让你了解这门语言的历史...