- 浏览: 64031 次
- 性别:
- 来自: 西安
最新评论
-
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 319// HttpServletRequest req = ( ... -
Spring cloud
2018-04-17 16:26 401这个博客写的不错。 http://www.ityoukno ... -
设计模式
2017-02-28 15:45 289温习了一波java设计模式,没看完。把一些觉得比较经典的模式 ... -
compare local files and remote files.
2016-09-08 14:27 455最近发生了一件怪事,项目在本地run的时候会报一个jar包下 ... -
Servlet 3.0 使用request.part 处理文件上传
2016-08-26 14:14 712Servlet3.0 提供了比较简单的文件上传的api,今 ... -
不用其他jar包,获取随机排列数组。
2016-08-23 16:19 456/* * 网上看到一道题,挺有意思。记录下来。 */ ... -
简单的 threadlocal 模拟 及测试
2016-07-15 17:22 682package org.vic.demo.ThreadLo ... -
模拟简单的 spring component scan
2016-07-14 15:31 613/** * specified character ... -
线程池+队列
2016-04-06 10:40 497笔记:自己实现的线程池+队列。 package org.vi ... -
eclipse 使用
2015-12-14 11:23 446同事整理的,挂在这分享、备用。 -
基于ReentrantLock 队列笔记
2015-12-11 12:40 655package org.vic.queue.core; ... -
java序列化
2015-11-24 17:02 363今天有同事问我动态读写对象的问题,于是就想到了序列化。在此做 ... -
Spring AOP 用法笔记
2015-11-17 17:42 778最近工作不太忙,把spring aop又重新看了一遍,今天 ... -
JVM总结
2015-11-05 11:14 1027有人问我: 你平时 ... -
java反射-实体类转xml jar包
2015-10-23 14:31 828同上一篇一样,避免重复造车轮,写了这个jar包。 引入ja ... -
基于LinkedBlockQueue 的消息队列jar包
2015-10-22 15:58 970为了让以后自己不再重复早轮子写的。 使用方法: ... -
线程的阻塞及唤醒
2015-10-15 18:01 598demo: 为方便展示,这里有两个类 : Taske ... -
自定义泛型的数组List
2015-10-09 10:12 676public class MyArrayList<T& ... -
HttpClient 模拟登录保持session并继续进行登录后操作
2015-09-08 13:05 8291公司考勤签到,每天都要登录系统签到,于是就在想:如果可以每 ... -
关闭流方法笔记
2015-09-01 09:19 624public 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笔记java笔记
java学习笔记java学习笔记java学习笔记java学习笔记
Java基础 java学习笔记 Java Java基础Markdown学习笔记,可转换成PDF、Word等格式
java笔记java笔记,java笔记java笔记java笔记java笔记
Java相关课程系列笔记之一Java学习笔记 Java相关课程系列笔记之四JDBC学习笔记 Java相关课程系列笔记之六HTML学习笔记 Java相关课程系列笔记之七CSS学习笔记 Java相关课程系列笔记之八JavaScript学习笔记 Java相关...
Java JDK 7学习笔记 PDF
[奥莱理] Java 8 Lambdas 学习笔记 [奥莱理] Java 8 Lambdas 学习笔记 [奥莱理] Java 8 Lambdas 学习笔记 [奥莱理] Java 8 Lambdas 学习笔记 [奥莱理] Java 8 Lambdas 学习笔记 [奥莱理] Java 8 Lambdas 学习笔记 ...
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记
Java游戏编程读书笔记,Java游戏编程读书笔记
良葛格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笔记java笔记java笔记java笔记 java笔记 java笔记
Java JDK 6学习笔记.zipJava JDK 6学习笔记.zip Java JDK 6学习笔记.zip Java JDK 6学习笔记.zip
收集的java李兴华老师的课件笔记。感觉还不错,适合回顾和新手补习。
java笔记java笔记java笔记java笔记java笔记java笔记java笔记java笔记
java笔记java笔记java笔记java笔记
java并发编程实践笔记java并发编程实践笔记java并发编程实践笔记java并发编程实践笔记
java框架核心技术笔记,java框架核心技术笔记,java框架核心技术笔记