`
vortexchoo
  • 浏览: 66814 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java socketio server 端 笔记

    博客分类:
  • java
阅读更多
项目需要做web端实时推送 引用了socketio来实现,今天做下笔记
需要的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作为暂存 效果更佳!
  • 大小: 148.4 KB
分享到:
评论
1 楼 obj704 2018-05-31  
想问一下这个程序中的 run函数是承担了主动向客户端推送的任务吗? 如果是的话 那是否应该单独启动线程来进行执行呢?

相关推荐

    Java学习笔记学习笔记

    Java学习笔记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相关课程系列笔记之九Servlet学习笔记

    Java相关课程系列笔记之一Java学习笔记 Java相关课程系列笔记之四JDBC学习笔记 Java相关课程系列笔记之六HTML学习笔记 Java相关课程系列笔记之七CSS学习笔记 Java相关课程系列笔记之八JavaScript学习笔记 Java相关...

    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 8 Lambdas 学习笔记 ...

    java+SSH+oracle+sqlserver学习笔记

    【Java SSH Oracle SQLServer 学习笔记】 Java是一种广泛使用的面向对象的编程语言,它以其跨平台、开源和丰富的库而闻名。SSH是三个开源框架的缩写,分别是Spring、Struts和Hibernate,它们在Java Web开发中起着至...

    Java基础 学习笔记 Markdownr版

    本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...

    Java JDK 7学习笔记 PDF

    Java JDK 7是Java开发工具包的一个重要版本,它的全称是Java Development Kit,是用于构建和运行Java应用程序的关键组件。这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些...

    达内Java_笔记整理.rar_Java 达内笔记_Java笔记_java 笔记_笔记_达内

    学习者可以通过这些笔记了解如何构建基于Java的服务器端应用。 最后,笔记可能还会提供一些实际项目案例,让学习者能够将理论知识应用到实践中,提升解决实际问题的能力。 总之,这份“达内Java_笔记整理.pdf”...

    良葛格java jdk 5.0学习笔记

    良葛格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学习笔记.pdf

    Java JDK 7学习笔记 此学习笔记适合初学者完成学习总结,加深理解 Java JDK 7学习笔记 此学习笔记适合初学者完成学习总结,加深理解

    教你如何将java代码拷贝到有道云笔记

    而将Java代码整理后存入有道云笔记的过程,既可以帮助开发者整理学习和工作中的代码,也能便于和其他开发者分享交流。 在这个过程中,首先需要使用一个能够处理和格式化代码的工具,如在线代码高亮工具,它能够将...

    Java JDK7学习笔记-光盘

    《Java JDK7学习笔记》是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习java时遇到的概念、操作、应用或认证考试等问题及解决方案。《Java JDK7学习笔记》针对java se 7新功能全面改版,无论是章节架构...

    ArcGIS Server 读书笔记

    ### ArcGIS Server 读书笔记知识点总结 #### 一、ArcGIS Server 概述 - **定义**:ArcGIS Server 是一款全面的企业级地理信息系统(GIS)服务器平台,它支持多种服务类型和技术标准,具备强大的空间数据管理和分析...

    java学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    Java基础每日复习笔记-JavaSE高级阶段.edf

    Java基础每日复习笔记-JavaSE高级阶段.edf

    尚硅谷JAVA基础笔记吐血整理

    “尚硅谷JAVA基础笔记”涵盖了Java语言的基础知识,包括语言概述、基本语法、面向对象概念、封装、继承和多态,以及一些关键概念如形参与实参、属性与局部变量、构造器、this关键字、包和MVC设计模式的使用。...

    java超强笔记

    "Java超强笔记"正是一份专为新手准备的学习资源,它全面涵盖了从Java环境的搭建到软件设计的各种概念,旨在提供一个易读且系统的学习路径。 首先,笔记可能会从Java的起源和发展开始介绍,让你了解这门语言的历史...

Global site tag (gtag.js) - Google Analytics