看到的应用mina做的一个实例
2012-10-21 22:21
246 查看
现在在做个车务通系统(网站),系统需要与远程的mina服务器端进行交换,服务器端由其他公司开发,只为我们提供接口,在我们的车务通系统中需要通过网络编程调用这些远程接口,所以车务通系统相当于mina的客户端(相对于mina服务器端而言)。
流程是这样的 当车务通系统的客户端,也就是浏览器页面,发出请求,车务通系统中的servlet接收,调用mina客户端的Iosession.write()方法 向mina服务器端(也就是远程服务器)发送请求、调用接口后 , 远程服务器会返回响应的处理结果,
然后在mina客户端(车务通系统中接收),messageReceive()方法负责接收,在这里遇到了问题,接收后的数据该如何返回给客户端(浏览器端)。
这个问题其实很简单,没有大家想的那么复杂,只是大家没有想到点子上而己,解决办法就是要将接收后的数据和当前请求联系起来就可以返回给客户端了,以下是简单的解决办法:
在车务通系统客户端,也就是浏览器页面,发出请求,调用mina客户端的Iosession.write()方法,发送请求前产生一个系统全局唯一标识,并将这个标识保存到Iosession中,如:
然后在mina客户端(车务通系统中接收),messageReceive()方责接收到消息时将系统全局唯一标识从Iosession中取出,将其和当前数据绑定保存,如:
最后通过系统全局唯一标识获取结果并返回给客户端
从上可知,我们可以通过IoSession将一个标识传到messageReceived方法中,熟悉web开发的知道,IoSession在这里跟HttpSession使用方式一样,因此我们可以将任何东东通过IoSession传到messageReceived方法中,比如HttpServletRequest、HttpServletResponse、Spring bean、Hibernate Dao、数据库连接等等。反之,在messageReceived方法中通过IoSession将接收后的数据或任何其它东东传到外面,这时就不能在messageReceived方法中关闭IoSession了。
用servlet简单写了一个例子,以供参考,见附件。采用同步、异步调用均可,任君选择,在这例子中我采用jquery的ajax异步调用
流程是这样的 当车务通系统的客户端,也就是浏览器页面,发出请求,车务通系统中的servlet接收,调用mina客户端的Iosession.write()方法 向mina服务器端(也就是远程服务器)发送请求、调用接口后 , 远程服务器会返回响应的处理结果,
然后在mina客户端(车务通系统中接收),messageReceive()方法负责接收,在这里遇到了问题,接收后的数据该如何返回给客户端(浏览器端)。
这个问题其实很简单,没有大家想的那么复杂,只是大家没有想到点子上而己,解决办法就是要将接收后的数据和当前请求联系起来就可以返回给客户端了,以下是简单的解决办法:
在车务通系统客户端,也就是浏览器页面,发出请求,调用mina客户端的Iosession.write()方法,发送请求前产生一个系统全局唯一标识,并将这个标识保存到Iosession中,如:
/** * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse * response) */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); String param1 = request.getParameter("param1"); // 创建客户端连接器 IoConnector connector = new NioSocketConnector(); // 设置事件处理器 connector.setHandler(new ClientHandler()); // 设置编码过滤器和按行读取数据模式 connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); // 创建连接 ConnectFuture future = connector.connect(new InetSocketAddress(TARGET_IP, PORT)); // 等待连接创建完成 future.awaitUninterruptibly(); // 获取连接会话 IoSession session = future.getSession(); // 产生当次发送请求标识,标识由客户端地址+随机数 // 这里的标识只是一个例子,标识可以任何方法产生,只要保持在系统中的唯一性 String flag = request.getLocalAddr() + UUID.randomUUID().toString(); //将标识保存到当前session中 session.setAttribute("SendRequestFlag", flag); /// 发送信息 session.write(param1); /// 等待连接断开 session.getCloseFuture().awaitUninterruptibly(); connector.dispose(); //通过标识获取保存的结果 Object result = ClientHandler.results.get(flag); //清除标识内容 ClientHandler.results.remove(flag); //将结果返回客户端 response.getWriter().write(result.toString()); }
然后在mina客户端(车务通系统中接收),messageReceive()方责接收到消息时将系统全局唯一标识从Iosession中取出,将其和当前数据绑定保存,如:
public static final Map<String,Object> results = new ConcurrentHashMap<String,Object>(); public void messageReceived(IoSession session, Object message) throws Exception { //从session中取到标识 String flag = (String)session.getAttribute("SendRequestFlag"); //将从服务端接收到的message和标识绑定保存,可以保存到内存、队列、文件、数据库等等 //在这里简单的以标识为key,message为value保存到Map中 results.put(flag, message); //关闭session session.close(true); }
最后通过系统全局唯一标识获取结果并返回给客户端
//通过标识获取保存的结果 Object result = ClientHandler.results.get(flag); //清除标识内容 ClientHandler.results.remove(flag); //将结果返回客户端 response.getWriter().write(result.toString());
从上可知,我们可以通过IoSession将一个标识传到messageReceived方法中,熟悉web开发的知道,IoSession在这里跟HttpSession使用方式一样,因此我们可以将任何东东通过IoSession传到messageReceived方法中,比如HttpServletRequest、HttpServletResponse、Spring bean、Hibernate Dao、数据库连接等等。反之,在messageReceived方法中通过IoSession将接收后的数据或任何其它东东传到外面,这时就不能在messageReceived方法中关闭IoSession了。
用servlet简单写了一个例子,以供参考,见附件。采用同步、异步调用均可,任君选择,在这例子中我采用jquery的ajax异步调用
相关文章推荐
- 栈(stack)的应用实例——将一个数组逆序输出
- 一个小应用的dbcp和c3p0配置实例
- Ajax在MVC中的应用——一个简单的.NET MVC 实例(续)
- 无缝滚动实例--dedecms的一个应用
- Android深入浅出系列之实例应用—如何在一个Activity里调用另外一个Activity?
- 转-如何确保应用只有一个实例运行
- C++ 容器的综合应用的一个简单实例——文本查询程序
- C++ 容器的综合应用的一个简单实例——文本查询程序
- 同一个PC只能运行一个应用实例(考虑多个用户会话情况)
- 使用nRF51822/nRF51422创建一个简单的BLE应用 ---入门实例手册(中文)之三
- 时间序列形态相似性分析(二)——相似性度量的一个应用实例
- 需要这样一个记录本-2 SQL Server触发器应用实例
- 在HP-UX上的一个应用数据迁移实例
- 贴一个定义android animation的应用实例
- samba服务器在企业中的一个应用实例 推荐
- Note_Cotes公式的一个实例应用
- 一个Mina实例
- Tab控件的一个简单应用实例
- 漫谈C指针:一个指针应用实例
- 一个简单而经典的RTX51 Tiny应用实例