`
joknm
  • 浏览: 62010 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

需要但没有session等会话信息下的程序开发

    博客分类:
  • JAVA
阅读更多
    本人最近在做个小实现:
     需求:类似于聊天室,但又为更广,些聊天可以通过手机短信,手机JAVA程序,网页,或者其它一些登陆到平台进行聊天。
     本人想破了脑袋也只能想出这一实现,如有做过这一项目,或者有更好意思的,欢迎发表,谢谢。
    本人的想法:由于此平台可以通过多个不同的服务进行交互。于是认为必须要一个主服务,此主服务可以通过子服务进行接入处理信息接收。主服务只做登陆人员的信息保存(主服务独立,没有session,application,所有登陆的人员信息要进行保存)。子服务可以随意装配到主服务里面去。主服务与不同子服务之间信息交换时有不同的法则,这个法则就是下面所说的命令。
   
package org.pjsh.main;

import java.lang.reflect.Method;
import java.util.Set;
import java.util.TreeMap;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.log4j.Logger;
import org.pjsh.dao.JpaServerDao;
import org.pjsh.entity.City;
import org.pjsh.entity.Country;
import org.pjsh.entity.Friend;
import org.pjsh.entity.Person;
import org.pjsh.entity.Province;
import org.pjsh.entity.Scene;
import org.pjsh.environment.Area;
import org.pjsh.environment.CityEvn;
import org.pjsh.environment.CountryEvn;
import org.pjsh.environment.ProvinceEvn;
import org.pjsh.environment.SceneEvn;
import org.pjsh.server.Server;
import org.pjsh.server.SocketServer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main extends Thread implements ServletContextListener
{
	private Area countryEvn;
	private JpaServerDao jpaServerDao;
	private TreeMap<String, String> map = new TreeMap<String, String>();
	private Logger log = Logger.getLogger(Main.class);

	public Main()
	{
		System.out.println("start server...");
		log.info("主服务启动...");
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		jpaServerDao = (JpaServerDao) ac.getBean("jpaServer");
		Country country = this.jpaServerDao.getCountryDao().getCountry(1);
		if (country != null)
		{
			countryEvn = new CountryEvn(country.getId(), country.getName());
			Set<Province> lProvice = country.getProvinceList();
			if (lProvice.size() > 0)
			{
				for (Province p : lProvice)
				{
					ProvinceEvn pe = new ProvinceEvn(p.getId(), p.getName());
					Set<City> lCity = p.getCityList();
					for (City c : lCity)
					{
						CityEvn ce = new CityEvn(c.getId(), c.getName());
						Set<Scene> lScene = c.getSceneList();
						for (Scene s : lScene)
						{
							SceneEvn se = new SceneEvn(
									s.getId(), 
									s.getName(),
									s.getSalutatory());
							ce.addSubArea(se);
						}
						pe.addSubArea(ce);
					}
					countryEvn.addSubArea(pe);
				}
			}
		}
		System.out.println("add command...");
		log.debug("添加命令行。");
		addCommandActuator("DL", "login"); // 添加登陆命令
		addCommandActuator("TC", "logout"); // 添加退出命令
		addCommandActuator("WZ", "getLocation"); // 添加显示位置命令
	}

	public JpaServerDao getJpaServerDao()
	{
		return this.jpaServerDao;
	}

	/**
	 * function: addCommandActuator 添加命令执行器与函数的对应关系
	 * 
	 * @param key
	 *            键
	 * @param value
	 *            值
	 */
	private void addCommandActuator(String key, String value)
	{
		map.put(key, value);
	}

	/**
	 * function: getCommandActuator 返回命令执行器
	 * 
	 * @param key
	 *            执行器对应的键
	 * @return String 执行器的名称
	 */
	private String getCommandActuator(String key)
	{
		return map.get(key);
	}

	/**
	 * function: getCommand 从发送来的消息中获取命令
	 * 
	 * @param message
	 *            消息
	 * @return String 返回取得的命令
	 */
	private String getCommand(String message)
	{
		message = message.trim();
		if (message.length() <= 0)
		{
			return null;
		}
		if (message.charAt(0) == '/')
		{
			StringBuffer buf = new StringBuffer();
			for (int i = 1; i < message.length(); i++)
			{
				if (i >= 4)
				{
					break;
				}
				if ((message.charAt(i) >= 'a' && message.charAt(i) <= 'z')
						|| (message.charAt(i) >= 'A' && message.charAt(i) <= 'Z'))
					buf.append(message.charAt(i) + "");
				else
					break;
			}
			if (buf.toString().length() <= 1)
			{
				return null;
			} else
			{
				return buf.toString().toUpperCase();
			}
		} else
		{
			return null;
		}
	}

	private void getLocation(String mobile1, String mobile2, String message)
	{
		Person person = countryEvn.getPerson(mobile1);
		String location = countryEvn.getLocation(person);
		notifySms(null, mobile1, "您所在的位置是:" + location);
	}

	/**
	 * function: resolveCommand 将命令解释成要运行的函数
	 * 
	 * @param command
	 *            命令
	 * @param sourceMobile
	 *            发送者的手机号码
	 * @param destMobile
	 *            接收者的手机号码
	 * @param message
	 *            将命令过滤后的消息
	 */
	public void resolveCommand(String command, String sourceMobile,
			String destMobile, String message, Server server)
	{
		if (command == null || command.length() <= 0)
			return;
		String value = this.getCommandActuator(command);
		Method[] methods = this.getClass().getDeclaredMethods();
		for (Method method : methods)
		{
			if (value.equalsIgnoreCase(method.getName()))
			{

				Class[] classes = method.getParameterTypes();
				Object[] object = new Object[classes.length];
				for (int i = 0; i < classes.length; i++)
				{
					if (classes[i].equals(String.class))
					{
						if (i == 0)
						{
							object[i] = sourceMobile;
						} else if (i == 1)
						{
							if (classes.length >= 3)
							{
								object[i] = destMobile;
							} else
							{
								object[i] = message;
							}
						} else
						{
							object[i] = message;
						}
					} else if (classes[i].equals(Server.class))
					{
						object[i] = server;
					} else
					{

					}
				}
				try
				{
					method.invoke(this, object);
				} catch (Exception e)
				{
					// TODO Auto-generated catch block
					log.error("方法执行失败!");
				}
			}
		}
	}

	/**
	 * function: login 用户登陆
	 */
	private void login(String mobile, Server server)
	{
		if (countryEvn != null)
		{
			Person person = countryEvn.isLogin(mobile);
			if (person == null)
			{
				person = jpaServerDao.getPersonDao().findByMobile(mobile);
				if (person == null)
				{
					this.notifySms(null, mobile, "未注册,请先注册!");
					return;
				}
				person.setServer(server);
				countryEvn.receivePerson(person);
				this.notifyLogin(person);
			} else
			{
				this.notifySms(null, mobile, "您已经登陆平台。您所在的位置是:"
						+ countryEvn.getLocation(person));
			}
		}
	}

	/**
	 * function: login 用户退出登陆
	 */
	private void logout(String mobile)
	{
		if (countryEvn != null)
		{
			Person person = countryEvn.getPerson(mobile);
			countryEvn.deletePerson(person);
			if (person == null)
			{
				this.notifySms(null, mobile, "您还没有登陆平台!");
				return;
			}
			this.notifyLogout(person);
		}
	}

	/**
	 * function: notifyLogout 退出时发出通知消息
	 * 
	 * @param person
	 *            人员信息对象
	 */
	private void notifyLogout(Person person)
	{
		if (person == null)
			return;
		notifySms(null, person.getMobile(), "成功退出,谢谢您的使用。");
		Set<Friend> set = person.getFriendList();
		for (Friend friend : set)
		{
			Person p = countryEvn.getPerson(friend.getId());
			if (p != null)
			{
				notifySms(
						null,
						p.getMobile(),
						friend.getName() == null ? 
							(person.getRealname() == null ? 
								person.getRealname()
								: person.getUsername())
							: friend.getName() + "已经离线!");
			}
		}
	}

	/**
	 * function: notifyLogin 登陆时发出通知消息
	 * 
	 * @param person
	 *            人员信息对象
	 */
	private void notifyLogin(Person person)
	{
		if (person == null)
			return;
		Set<Friend> set = person.getFriendList();
		for (Friend friend : set)
		{
			Person p = countryEvn.getPerson(friend.getId());
			if (p != null)
			{
				notifySms(
						null,
						p.getMobile(),
						friend.getName() == null ? 
							(person.getRealname() == null ?
								person.getRealname()
								: person.getUsername())
							: friend.getName() + "上线了!");
			}
		}
	}

	/**
	 * function: notifySms 消息发送
	 * 
	 * @param mobile
	 *            接收消息的手机号码
	 * @param msgStr
	 *            发送的消息
	 */
	private void notifySms(String sourceMobile, String destMobile,
			String message)
	{
		log.debug("消息来自手机:" + sourceMobile + ";目的手机:" + destMobile + ";消息:"
				+ message);
		if (destMobile == null || message == null)
		{
			log.debug("手机号码或者要发送的信息为空!");
		} else
		{
			log.debug("mobile=" + destMobile + ";message=" + message);
			countryEvn.notifySms(sourceMobile, destMobile, message);
		}
	}

	public void run()
	{
	}

	public void contextDestroyed(ServletContextEvent arg0)
	{
		// TODO Auto-generated method stub

	}

	// Tomcat 启动时自动加载
	public void contextInitialized(ServletContextEvent arg0)
	{
		// 插入SocketServer子服务
		SocketServer ss = new SocketServer(this);
		ss.start();
		System.out.println("start server success!");
		log.info("主服务启动结束");
	}
}
    
分享到:
评论
3 楼 joknm 2009-10-23  
什么是边界接入?可以讲解下吗,或者给些资料,我在网上找不到边界接入的相关资料。谢谢
2 楼 fjlyxx 2009-10-19  
我只看了 上面需求部分

需求:类似于聊天室,但又为更广,些聊天可以通过手机短信,手机JAVA程序,网页,或者其它一些登陆到平台进行聊天。

个人觉得LZ搞懂了边界接入 就可以很好的解决这个问题.
1 楼 qiren83 2009-10-19  
没怎么看明白 楼主能多些文字说明吗?

相关推荐

    实战EJB之三 开发会话Bean(有状态会话Bean).doc

    开发一个有状态会话Bean需要继承javax.ejb.SessionBean接口,并实现相应的生命周期方法,如ejbCreate()、ejbRemove()、ejbPassivate()、ejbActivate()等。 5. 部署到应用服务器 在部署到应用服务器时,需要配置ejb...

    JavaWeb开发技术-会话技术.pptx

    在JavaWeb开发技术中,会话技术是指Web应用程序中的一种机制,用于记录和跟踪用户的交互过程。它允许Web应用程序维护用户的状态,实现用户与服务器之间的交互。会话技术是Web开发中不可或缺的一部分,对于实现复杂的...

    微信小程序会话管理客户端

    微信的网络请求接口 wx.request() 没有携带 Cookies,这让传统基于 Cookies 实现的会话管理不再适用。为了让处理微信小程序的服务能够识别会话,我们推出了 weapp-session。

    微信小程序开发之保持用户的session

    在微信小程序开发中,由wx.request()发起的每次请求对于服务端来说都是不同的一次会话,即对应服务端不同的session,由于项目中使用session保存用户信息所以导致后续请求相当于未登录的情况。 解决办法:1、在用户...

    Laravel开发-laravel-mongodb-session

    Laravel开发-laravel-mongodb-session 用于Laravel 5.3的MongoDB会话驱动程序

    Laravel开发-laravel-dynamodb-session-driver

    Laravel开发-laravel-dynamodb-session-driver Laravel 5的dynamodb会话驱动程序

    微信公众平台与小程序开发 从零搭建整套系统

    10.2.1 公众号会话保存Session 153 10.3 自定义菜单 154 10.4 小结 157 第11章 案例:微信随手记 11.1 需求描述 159 11.2 数据库设计 159 11.3 代码实现 161 11.3.1 添加主题 161 11.3.3...

    六大对象Response,Request,Server,Application,Session,Cookie

    Application对象在实际网络开发中的用途就是记录整个网络的信息,如上线人数、在线名单、意见调查和网上选举等。在给定的应用程序的多有用户之间共享信息,并在服务器运行期间持久的保存数据。而且Application对象...

    《session详解》

    session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。 session在WEB技术中占有非常重要的份量。由于网页是一...

    有状态会话Bean实验指导.doc

    试验题目:Session Bean组件的开发与应用。 试验目的:通过对简单会话Bean组件的编写,加深对EJB理论知识的理解,为更深层的EJB应用做准备。 试验任务:设计一个会话Bean,进行计数。将当前的计数值存储在Bean中,当...

    无状态会话Bean实验指导.doc

    试验题目:无状态Session Bean组件的开发与应用。 试验目的:通过对简单无状态会话Bean组件的编写,加深对EJB理论知识的理解,为更深层的EJB应用做准备。 试验任务:根据EJB组件的结构体系和运行机理,编写实现显示...

    Laravel开发-laravel-session-fallback

    Laravel开发-laravel-session-fallback 为会话处理程序提供回退机制

    Laravel开发-laravel-mongo-session

    Laravel开发-laravel-mongo-session 用于Laravel 4的MongoDB会话驱动程序

    微信公众平台与小程序开发 从零搭建整套系统.part2

    本资源是《微信公众平台与小程序开发 从零搭建套系统》高清PDF扫描版。该书由张剑明著,中国工信出版集团和人民邮电出版社联合出版,有需要的小伙伴可以下载学习参考。 本书目录如下: 第1章 微信生态 1.1 微信:...

    微信公众平台与小程序开发 从零搭建整套系统.part1

    本资源是《微信公众平台与小程序开发 从零搭建套系统》高清PDF扫描版。该书由张剑明著,中国工信出版集团和人民邮电出版社联合出版,有需要的小伙伴可以下载学习参考。 本书目录如下: 第1章 微信生态 1.1 微信:...

    nginx-session-ticket-key-rotation:Nginx 会话票据密钥轮换程序,用于安全轮换 TLS 会话票据密钥并在服务器集群中共享

    虽然我的目标是在这里提供一个完整的文档,但我目前没有时间写它,因为(你猜对了)我正在写论文。 如果您有疑问或发现错误,请随时打开问题。 用法 您应该将存储库克隆到可以保留的位置。 这些文件是必需的,不应...

    【ASP.NET编程知识】iframe跨域与session失效问题的解决办法.docx

    在 ASP.NET 开发中,跨域和 Session 失效问题是一个常见的问题,但通过添加“P3P”协议和使用 HttpContext.Current.Session,我们可以解决这个问题,从而确保应用程序的正常运行。 相关知识点: * 跨域和 Session ...

    new-session-manager:通过将独立程序分组为会话来辅助音乐制作。社区版本的“非会话管理器”

    要学习NSM,您不需要了解我们的文档中的背景信息,该文档是针对希望在其程序中实现NSM支持的开发人员的。了解GUI,而不是服务器和协议。 项目符号点 直接替换非会话管理器守护程序nsmd和工具(例如j

    微信公众号小程序开发案例源码

    已经支持几乎所有微信平台模块和接口,... 已经支持用户会话上下文(解决服务器无法使用Session处理用户信息的问题)。 已经全面支持微信公众号、企业号、开放平台的最新API。 已经支持分布式缓存及缓存策略扩展。

    JSP应用开发-JSP内置对象.pptx

    例如,可以使用request对象来获取客户提交的数据,使用response对象来重定向客户,使用session对象来保存会话数据等。 四、JSP内置对象的作用范围 JSP内置对象的作用范围不同,request对象和response对象的作用...

Global site tag (gtag.js) - Google Analytics