- 浏览: 445062 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
danStart:
想问问,能监测服务是否挂掉吗?
公司要求实时监控服务器,写个Web的监控系统 -
hepct:
你好,最近在搭一个游戏服务器,能加好友请教下吗?1538863 ...
java游戏服务端实现 -
Limewwy:
没打完就发表了?为啥要这样设置?【游戏中需要传递用户的积分,这 ...
java游戏服务端实现 -
Limewwy:
楼主您好。请教为啥要这样设计?
java游戏服务端实现 -
3849801:
楼主,能够提供更具体的文档或者指导吗?我想搭建一个服务端,非常 ...
java游戏服务端实现
Tomcat7.0.0已经出来了,关注它已经支持servlet3.0规范,servlet3.0规范有一个很值得期待的特性就是,支持异步IO通信,何为异步响应,就是保持长连接,让servlet实现原先的TCP Server才能做到的事,就像我以前写的一个WEB IM。没有用到comet,使用Ajax轮询聊天,反应慢不说,很多时候轮询的资源是被浪费掉的,杯具啊
现在好了Tomcat7.0.0已经原生支持comet和异步IO,但是需要APR 或者NIO HTTP连接器,应该在新的servlet-api,会提供tomcat7.0-guide的原文如下:
Usage of these features requires using the APR or NIO HTTP connectors. The classic java.io HTTP connector and the AJP connectors do not support them,
实际是使用,需要增加对NIO的支持,要做的仅仅是在server.xml里边修改connector:
<connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8080" redirectport="8443" connectiontimeout="20000">
要用好这个comet需要了解comet的几个事件
EventType.BEGIN:开始连接,比如用户的一个聊天消息刚发送到了你的comet聊天服务器,建立连接后,但是你还没有开始读。(因为被加锁了,有可能正在读其他用户的聊天消息)你可以通过CometEvent 对象获取该用户request,response,当锁被你获得后,使用这些request该怎么做就由你了,比如得到这个request的聊天正文或者头域。最重要的是,你可以取得这个用户的response,放到你定义的一个全局容器中,比如这样
protected ArrayList connections = new ArrayList(); synchronized(connections) { connections.add(response); }
这端代码很重要,因为只有保存了用户响应的句柄,才是异步comet的关键所在,你可以决定什么时候,什么内容什么顺序把消息分发给哪一个用户.
synchronized(connections) { connections.remove(response); }
- EventType.ERROR:当一次IO异常或者一次不可发生的错误发生,那些在begin方法中初始化的资源会被重置,这个request和response将会被回收(就是某一个发生ioexception客户的资源都要被重置,抓住这个错误可以提示给用户一些有用的信息,比如:你和服务器的连接发生了错误,请重新登录聊天室)
下面这个是模拟TCP CHART Server的Servlet聊天服务器,是基于异步长连接的
public class ChatServlet extends HttpServlet implements CometProcessor { protected ArrayList connections = new ArrayList(); protected MessageSender messageSender = null; public void init() throws ServletException { //聊天服务器servlet启动的时候自动启动一个线程来接收用户的聊天消息,并广播出去 messageSender = new MessageSender(); Thread messageSenderThread = new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + "]"); messageSenderThread.setDaemon(true); messageSenderThread.start(); } public void destroy() { //清除资源 connections.clear(); messageSender.stop(); messageSender = null; } /** * Process the given Comet event. * * @param event The Comet event that will be processed * @throws IOException * @throws ServletException */ public void event(CometEvent event) throws IOException, ServletException { HttpServletRequest request = event.getHttpServletRequest(); HttpServletResponse response = event.getHttpServletResponse(); if (event.getEventType() == CometEvent.EventType.BEGIN) { //加入刚收到这个用户的请求,触发CometEvent.EventType.BEGIN事件,先打印出一些消息头,并且把这个用户的//response保存在缓存容器中,以备广播用 log("Begin for session: " + request.getSession(true).getId()); PrintWriter writer = response.getWriter(); writer.println(""-//w3c//dtd html 4.0 transitional//en\">"); writer.println("JSP Chat"); writer.flush(); synchronized(connections) { connections.add(response); } } 假如IO错误了,当然释放这个连接,清空这个缓存的response句柄,该用户web im应该提示服务器错误,或者超时 else if (event.getEventType() == CometEvent.EventType.ERROR) { log("Error for session: " + request.getSession(true).getId()); synchronized(connections) { connections.remove(response); } event.close(); } //结束时候也是释放连接,清空这个缓存的response句柄,值得注意的是,这时候用户已经断开聊天服务器 else if (event.getEventType() == CometEvent.EventType.END) { log("End for session: " + request.getSession(true).getId()); synchronized(connections) { connections.remove(response); } PrintWriter writer = response.getWriter(); writer.println("</body></html>"); event.close(); } else if (event.getEventType() == CometEvent.EventType.READ) { InputStream is = request.getInputStream(); byte[] buf = new byte[512]; do { int n = is.read(buf); //can throw an IOException//由于已经在线程中已经读消息和广播消息了,这里这个事件主要用来log输出用户发来的聊天内容 if (n > 0) { log("Read " + n + " bytes: " + new String(buf, 0, n) + " for session: " + request.getSession(true).getId()); } else if (n < 0) { error(event, request, response); return; } } while (is.available() > 0); } }
//该线程用来接收用户的消息,和向所有用户广播消息,应该不是很难 public class MessageSender implements Runnable { protected boolean running = true; protected ArrayList<String> messages = new ArrayList<String>(); public MessageSender() { } public void stop() { running = false; } /** * Add message for sending. */ public void send(String user, String message) { synchronized (messages) { messages.add("[" + user + "]: " + message); messages.notify(); } } public void run() { while (running) { if (messages.size() == 0) { try { synchronized (messages) { messages.wait(); } } catch (InterruptedException e) { // Ignore } } synchronized (connections) { String[] pendingMessages = null; synchronized (messages) { pendingMessages = messages.toArray(new String[0]); messages.clear(); } // 传说中的广播 for (int i = 0; i < connections.size(); i++) { try { PrintWriter writer = connections.get(i).getWriter(); for (int j = 0; j < pendingMessages.length; j++) { writer.println(pendingMessages[j] + "<br>"); } writer.flush(); } catch (IOException e) { log("IOExeption sending message", e); } } } } } } }
评论
tomcat6 的nio 就是异步的
所以要体验servlet3的话,现阶段建议还是拿glassfish来玩。
非常同意楼上的观点,现在Tomcat 7.0号称是Beta版,其实很不稳定,Bug很多,连jsp都不能很好的兼容,解析时总是报莫名其妙的xml解析异常,上周整了一天,差点没把我整死,这些在glassfish3下不不会出现的。glassfish确实非常强大,就怪sun的销售做的太烂,这么好的产品居然赚不到钱,定制了java ee标准,结果钱都让别人赚了,市场也丢了,现在公司都没了,唉。。。。
所以要体验servlet3的话,现阶段建议还是拿glassfish来玩。
恩 最近在公司没事做准备改进下原先轮询的web im,多谢推荐,下周试试glassfish来实现
所以要体验servlet3的话,现阶段建议还是拿glassfish来玩。
2.LZ的文章并非原创,起码代码实例部分应该来自这里吧:http://www.ibm.com/developerworks/cn/web/wa-cometjava/
恩我的代码部分确实不是原创的,但是加上自己的理解,这篇imb文章引用的代码也不是原创,都是引用apche7.0 comet的demo代码(原文英文),我这篇文章有很多自己分析的东西,所以理解也不一定准确
2.LZ的文章并非原创,起码代码实例部分应该来自这里吧:http://www.ibm.com/developerworks/cn/web/wa-cometjava/
发表评论
-
ant使用小结
2014-04-01 13:12 3310Java代码 1. <prope ... -
模拟登录
2011-10-21 16:25 1878public class QQ { public stati ... -
在线查询使用常用API
2011-09-13 13:30 1391转载 收集了一些常用的API参考文档,放在这里以备及时 ... -
在linux中执行平台相关runtime.exec()
2011-03-23 15:46 2168/* * @(#) Exec.java Feb 28, 201 ... -
Finalize 和 GC的区别
2011-02-16 10:38 1250finalize()是由JVM自动调用的,你可以用System ... -
转:ThreadLocal示例
2010-09-09 09:00 1373本文借花献佛,引用Ti ... -
java加密解密
2010-04-16 11:29 1770转载:http://blog.csdn.net/xwchen/ ... -
优化MyEclipse
2010-01-04 14:23 1302“工欲善其事必先利其 ... -
html放入一个String中,将每行<td class = "b"></td>中的值读出
2009-04-09 17:33 2722我现在有一个网页。 <html> <body ... -
编写高效的线程安全类
2009-03-24 11:22 953文档选项 ... -
Struts中Token的使用方法
2008-11-25 16:11 4680Token的使用方法使用Token可以防止当用 ... -
一个基于Java和ajax得Web层聊天室
2008-10-11 17:22 4300一个基于Java和Ajax的聊 ... -
J2EE开发之常用开源项目介绍
2008-08-06 19:49 1098J2EE开发之常用开源项目介绍 主要就我所了解的J2EE开 ... -
获得来访IP
2008-07-30 15:54 1532public static String ge ... -
Java发送Html请求,并解析返回的请求
2008-07-10 11:00 9516今天是2008年7月7日星期一,下午一直在学校做个人开始页面。 ... -
编写对gc友好,又不泄露的代码
2008-07-10 09:59 1154作者:江南白衣,最新版链接:http://blog.csdn. ... -
java.util.Collections.sort(List list)与Comparable,
2008-07-09 17:31 4921java.util.Collections.sort(List ... -
java不用jni,也可以获得当前系统性能信息
2008-07-04 13:23 11576最近做个项目,就是要取得cpu占有率等等的系统信息,一开始以为 ... -
在struts中使用checkbox实现批量删除
2008-04-30 11:32 4663<html:form StyleId = "d ... -
HttpURLConnection中获得重定向的地址 (转)
2008-04-22 09:35 10957HttpURLConnection使用中的一个问题,就是当连接 ...
相关推荐
该系统旨在适应网络技术的发展,将传统的CS(客户端-服务器)模式转向BS(浏览器-服务器)模式,利用Java的Servlet和JSP技术,这两种技术是Java开发Web应用的核心,尤其适合大型项目。JSP是对Servlet的简化,方便...
开发环境是在Windows操作系统下,利用Myeclipse 8.5作为集成开发环境,MySQL 5.5作为数据库,以及Tomcat 7.0作为应用服务器。 实验设计的核心在于实现以下功能: 1. 登录功能:用户可以通过login.html页面选择学生...
随着网络技术的快速发展,传统的CS(Client-Server)应用逐渐转向BS模式,Java由于其跨平台、安全性高以及强大的功能特性,成为Web开发的重要语言。Servlet和JSP是JavaWeb开发的关键,Servlet作为服务器端的程序处理...
随着信息技术的发展,传统的CS(Client/Server)架构的图书管理系统已经无法满足现代高校的需求,因此转向BS(Browser/Server)架构的系统成为必然趋势。这样的转变能提升系统的可维护性和应用范围,适应互联网时代...
数据库选用MySQL 5.5,用于存储学生管理系统的数据,而服务器则使用Tomcat 7.0,这是一个轻量级的Java应用服务器,特别适合开发和部署JavaWeb应用。 【系统设计】:系统采用了模型-视图-控制器(MVC)设计模式,这...
本次实验在Windows操作系统下进行,采用集成开发环境MyEclipse 8.5,搭配MySQL 5.5数据库和Tomcat 7.0服务器。MVC(Model-View-Controller)设计模式被作为参考,尽管系统规模较小,没有单独设立业务层,而是直接在...
数据库选用MySQL 5.5,提供数据存储服务,而服务器使用Tomcat 7.0,它是流行的Java Servlet容器,支持Servlet和JSP的运行。 【系统设计与实现】 系统设计遵循MVC(Model-View-Controller)模式,尽管为了简化,...
此项目为J2EE BS/CS项目 需要 :tomcat6.0f服务器 数据库 struts1/struts2动态库架包 myeclipse7.0集成开发工 链接串口连接数据库驱动 串口发短架包 GPRS模块等 运用了MVC三层架构开发模式 struts1/strts2结合...
6版本虽新增了一些节点和属性,但这些新特性在当前设计器中尚无法实现。这意味着Flowable更适合那些熟悉Eclipse开发环境的专业开发者使用,而对于非技术人员的支持较弱。 **小结** Camunda的设计工具能够更好地...
硬件要求包括Inter Pentium3以上的处理器和512M以上的内存,软件环境则包括Windows XP/Linux操作系统、Internet Explorer 7.0以上的浏览器,以及MyEclipse、Tomcat 7.0和MySQL等开发工具。系统开发在MyEclipse环境中...
开发环境主要包括Windows操作系统,MyEclipse 8.5作为集成开发环境,MySQL 5.5作为数据库管理系统,以及Tomcat 7.0作为应用服务器。这种配置提供了开发Web应用程序所需的基本工具链。 在系统设计上,虽然完整的MVC...
- 图书管理系统通常由CS(Client-Server)架构向BS(Browser-Server)架构转变,以适应互联网的广泛使用和信息交流的需求。 - Oracle数据库被选中,因为其高效的数据检索能力、稳定性和良好的性能,适合处理大量...