- 浏览: 62010 次
- 性别:
- 来自: 南宁
-
最新评论
-
diwuci:
用response.setContentType(" ...
spring mvc 系列3 返回JSON以及文件上传 -
dickluo:
得花时间好好看下代码了 多谢
spring mvc 系列1 环境配置 -
muqingren:
这个学习了,歇息
spring mvc 系列3 返回JSON以及文件上传 -
JetMah:
Jophy 写道
@RequestMapping(pa ...
spring mvc 系列3 返回JSON以及文件上传 -
LifeFree:
LZ 1.的实现,貌似有笔误。
应该类似:
param = ...
一个小细节现实后的蛋疼结果。
本人最近在做个小实现:
需求:类似于聊天室,但又为更广,些聊天可以通过手机短信,手机JAVA程序,网页,或者其它一些登陆到平台进行聊天。
本人想破了脑袋也只能想出这一实现,如有做过这一项目,或者有更好意思的,欢迎发表,谢谢。
本人的想法:由于此平台可以通过多个不同的服务进行交互。于是认为必须要一个主服务,此主服务可以通过子服务进行接入处理信息接收。主服务只做登陆人员的信息保存(主服务独立,没有session,application,所有登陆的人员信息要进行保存)。子服务可以随意装配到主服务里面去。主服务与不同子服务之间信息交换时有不同的法则,这个法则就是下面所说的命令。
需求:类似于聊天室,但又为更广,些聊天可以通过手机短信,手机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("主服务启动结束"); } }
- Game.rar (9.9 MB)
- 下载次数: 16
评论
3 楼
joknm
2009-10-23
什么是边界接入?可以讲解下吗,或者给些资料,我在网上找不到边界接入的相关资料。谢谢
2 楼
fjlyxx
2009-10-19
我只看了 上面需求部分
需求:类似于聊天室,但又为更广,些聊天可以通过手机短信,手机JAVA程序,网页,或者其它一些登陆到平台进行聊天。
个人觉得LZ搞懂了边界接入 就可以很好的解决这个问题.
需求:类似于聊天室,但又为更广,些聊天可以通过手机短信,手机JAVA程序,网页,或者其它一些登陆到平台进行聊天。
个人觉得LZ搞懂了边界接入 就可以很好的解决这个问题.
1 楼
qiren83
2009-10-19
没怎么看明白 楼主能多些文字说明吗?
发表评论
-
一个小细节现实后的蛋疼结果。
2011-03-07 08:37 1151情况是这样子的,比如你用单击按钮在单数次单击里面要求某个数为0 ... -
eclipse3.6 集成 myeclipse 插件
2010-11-16 14:06 4677最近很是邪恶,不想费钱,但又不想邪恶的去找 myeclipse ... -
spring mvc 系列3 返回JSON以及文件上传
2010-10-10 18:58 9717先来看下spring mvc提供返回为json数据的注解 ... -
spring mvc 系列2 泛型DAO(基于存储过程)
2010-10-06 14:05 5445spring mvc 系列1 中: 感谢 ricoyu 提示 ... -
spring mvc 系列1 环境配置
2010-10-02 18:59 1955废话: 热门?=spring + hibernate + st ... -
finally 浅谈
2010-07-29 10:01 2358近日做程序时突发奇想:try ... finally ... ... -
大量数据访问时,用JPA 对象映射关系会出错?
2009-12-30 09:23 2767昨天在做一JPA调试时出了些莫名其妙的错。 public ... -
单线程处理多任务处理方式
2009-12-27 16:14 4238缘由: 在实际的应用中可能会出现这样一种尴尬:只有一个 ... -
命令模式,解释命令
2009-12-26 21:52 1055用命令模式解释命令 ... -
Hibernate+jpa+spring
2009-12-23 17:34 1321今天搞了一个JPA+HIBERNATE,以下是资料,全英文 h ... -
jpa 多个对象映射同时加载
2009-10-13 23:18 1352jpa 多个对象映射同时加载 FetchType可设置为EA ... -
利用RMI实现JAVA分布式应用
2009-10-10 15:53 999Java RMI (Remote Method Invocat ... -
一道SQL面试题
2009-09-22 17:28 1082有两个表, table1, table2, Table tab ... -
java 取随机字符串
2009-09-16 13:51 4630package org.jinsheng.util; ... -
junit4单元测试的注释使用说明
2009-08-24 23:16 4765junit4单元测试的使用说明 右键项目->prope ... -
spring2.5注释型 + jpa + 数据库池的配置(4)
2009-08-10 00:57 1301PersonDao.java package org.ji ... -
spring2.5注释型 + jpa + 数据库池的配置(3)
2009-08-10 00:45 1076Person.java(实体文件) package org ... -
spring2.5注释型 + jpa + 数据库池的配置(2)
2009-08-10 00:41 1237文件配置: applicationContext.xml ... -
spring2.5注释型 + jpa + 数据库池的配置(1)
2009-08-10 00:28 1802本人用的环境是:eclipse 3.0 + jdk 6.0_1 ...
相关推荐
开发一个有状态会话Bean需要继承javax.ejb.SessionBean接口,并实现相应的生命周期方法,如ejbCreate()、ejbRemove()、ejbPassivate()、ejbActivate()等。 5. 部署到应用服务器 在部署到应用服务器时,需要配置ejb...
在JavaWeb开发技术中,会话技术是指Web应用程序中的一种机制,用于记录和跟踪用户的交互过程。它允许Web应用程序维护用户的状态,实现用户与服务器之间的交互。会话技术是Web开发中不可或缺的一部分,对于实现复杂的...
微信的网络请求接口 wx.request() 没有携带 Cookies,这让传统基于 Cookies 实现的会话管理不再适用。为了让处理微信小程序的服务能够识别会话,我们推出了 weapp-session。
在微信小程序开发中,由wx.request()发起的每次请求对于服务端来说都是不同的一次会话,即对应服务端不同的session,由于项目中使用session保存用户信息所以导致后续请求相当于未登录的情况。 解决办法:1、在用户...
Laravel开发-laravel-mongodb-session 用于Laravel 5.3的MongoDB会话驱动程序
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...
Application对象在实际网络开发中的用途就是记录整个网络的信息,如上线人数、在线名单、意见调查和网上选举等。在给定的应用程序的多有用户之间共享信息,并在服务器运行期间持久的保存数据。而且Application对象...
session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。 session在WEB技术中占有非常重要的份量。由于网页是一...
试验题目:Session Bean组件的开发与应用。 试验目的:通过对简单会话Bean组件的编写,加深对EJB理论知识的理解,为更深层的EJB应用做准备。 试验任务:设计一个会话Bean,进行计数。将当前的计数值存储在Bean中,当...
试验题目:无状态Session Bean组件的开发与应用。 试验目的:通过对简单无状态会话Bean组件的编写,加深对EJB理论知识的理解,为更深层的EJB应用做准备。 试验任务:根据EJB组件的结构体系和运行机理,编写实现显示...
Laravel开发-laravel-session-fallback 为会话处理程序提供回退机制
Laravel开发-laravel-mongo-session 用于Laravel 4的MongoDB会话驱动程序
本资源是《微信公众平台与小程序开发 从零搭建套系统》高清PDF扫描版。该书由张剑明著,中国工信出版集团和人民邮电出版社联合出版,有需要的小伙伴可以下载学习参考。 本书目录如下: 第1章 微信生态 1.1 微信:...
本资源是《微信公众平台与小程序开发 从零搭建套系统》高清PDF扫描版。该书由张剑明著,中国工信出版集团和人民邮电出版社联合出版,有需要的小伙伴可以下载学习参考。 本书目录如下: 第1章 微信生态 1.1 微信:...
虽然我的目标是在这里提供一个完整的文档,但我目前没有时间写它,因为(你猜对了)我正在写论文。 如果您有疑问或发现错误,请随时打开问题。 用法 您应该将存储库克隆到可以保留的位置。 这些文件是必需的,不应...
在 ASP.NET 开发中,跨域和 Session 失效问题是一个常见的问题,但通过添加“P3P”协议和使用 HttpContext.Current.Session,我们可以解决这个问题,从而确保应用程序的正常运行。 相关知识点: * 跨域和 Session ...
要学习NSM,您不需要了解我们的文档中的背景信息,该文档是针对希望在其程序中实现NSM支持的开发人员的。了解GUI,而不是服务器和协议。 项目符号点 直接替换非会话管理器守护程序nsmd和工具(例如j
已经支持几乎所有微信平台模块和接口,... 已经支持用户会话上下文(解决服务器无法使用Session处理用户信息的问题)。 已经全面支持微信公众号、企业号、开放平台的最新API。 已经支持分布式缓存及缓存策略扩展。
例如,可以使用request对象来获取客户提交的数据,使用response对象来重定向客户,使用session对象来保存会话数据等。 四、JSP内置对象的作用范围 JSP内置对象的作用范围不同,request对象和response对象的作用...