基于Tomcat7、Java、WebSocket的服务器推送聊天室 (转)

前言

HTML5
WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用。以前
的服务器消息推送大部分采用的都是“轮询”和“长连接”技术,这两中技术都会对服务器产生相当大的开销,而且实时性不是特别高。WebSocket技术对
只会产生很小的开销,并且实时性特别高。下面就开始讲解如何利用WebSocket技术开发聊天室。在这个实例中,采用的是Tomcat7服务器,每个服
务器对于WebSocket的实现都是不一样的,所以这个实例只能在Tomcat服务器中运行,不过目前Spring已经推出了WebSocket的
API,能够兼容各个服务器的实现,大家可以查阅相关的资料进行了解,在这里就不介绍了,下图是聊天室的效果图:

在这里实例中,实现了消息的实时推送,还实现了聊天用户的上下线通知。下面就开始具体讲解如何实现。

后台处理

Tomcat实现WebSocket的主要是依靠org.apache.catalina.websocket.MessageInbound这个类,这
个类的在{TOMCAT_HOME}/lib/catalina.jar中,所以你开发的时候需要将catalina.jar和tomcat-
coyote.jar引入进来,下面这段代码就是暴露给客户端连接地址的Servlet:

[java] view
plain
copy

  1. package

    import
    import

    import

    @WebServlet})

  2. //如果要接收浏览器的ws://协议的请求就必须实现WebSocketServlet这个类
    publicclassextends

    privatestaticfinallong

    publicstaticint;

  3. public
    return);
  4. protected
    returnnewthis

    }

这个Servlet跟普通的Servlet有些不同,继承的WebSocketServlet类,并且要重写
createWebSocketInbound方法。这个类中Session中的user属性是用户进入index.jsp的时候设置的,记录当前用户的
昵称。下面就是自己实现的WebSocket连接对象类WebSocketMessageInbound类的代码:

[java] view
plain
copy

  1. package

    import
    import
    import

    import

    import
    import

    publicclassextends

  2. privatefinal

    public
    this

    public
    returnthis

  3. protectedvoid
  4. new
    , );
  5. , this
  6. new
    , );
  7. , WebSocketMessageInboundPool.getOnlineUser());
  8. this
  9. this
  10. protectedvoidint
  11. this
    new
    , );
  12. , this
  13. protectedvoidthrows
    thrownew
  14. protectedvoidthrows
  15. }

代码中的主要实现了onOpen、onClose、onTextMessage方法,分别处理用户上线、下线、发送消息。在这个类中有个
WebSocketMessageInboundPool连接池类,这个类是用来管理目前在线的用户的连接,下面是这个类的代码:

[java] view
plain
copy

  1. package

    import
    import
    import
    import
    import

    publicclass

  2. privatestaticfinalnew
  3. publicstaticvoid
  4. publicstatic
    return

    publicstaticvoid

  5. publicstaticvoid
    try
  6. ifnull

    catch

  7. publicstaticvoid
    try

    for

    ifnull

    catch

    }

前台展示

上面的代码就是聊天室后台的代码,主要是由3个对象组成,Servlet、连接对象、连接池,下面就是前台的代码,前台的代码主要是实现与服务器进行连
接,展示用户列表及信息列表,前台的展示使用了Ext框架,不熟悉Ext的同学可以初步的了解下Ext,下面的是index.jsp的代码:

[html] view
plain
copy

  1. <= = =%>
    <
     = (String)session.getAttribute("user");
  2. == null){
  3. =  + WebSocketMessageServlet.ONLINE_USER_COUNT;
  4. >
    <html>
    <head>
    <title></title>
  5. <link= = =>
    <link= = = />
    <link= = = />
  6. <script= =></script>
    <script= =></script>
    <script=>
     = ;
  7. </script>
    </head>

    <body>
    <h1></h1>
    <p></p>
    <ul= =>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    </ul>
    <div=></div>
    </body>
    </html>

页面的展示主要是在websocket.js中进行控制,下面是websocket.jsd的代码:

[javascript] view
plain
copy

  1. //用于展示用户的聊天信息
    ‘MessageContainer‘

    ,

  2. true

    false

    ,

  3. ,
  4. ,
  5. ,
  6. ,
  7. ,
  8. ],
  9. function
    varthis
    , {
  10. ,
  11. , , , ]
  12. , {
  13. ,
  14. function
    varthis
    ] = Ext.Date.format(new]),
  15. );
  16. if
    ;
  17. else
    ;
  18. if

    });

这段代码主要是实现了展示消息的容器,下面就是页面加载完成后开始执行的代码:

[javascript] view
plain
copy

  1. Ext.onReady(function
  2. var, {
  3. ,
  4. false
    false
    false

    function

    function
    iftrue

  5. var, {
  6. var, {
  7. ,
  8. ,
  9. ,
  10. var
  11. function
    if
    new));
  12. function
  13. );
  14. function
  15. );
  16. function
  17. );
  18. function
    var
  19. if) {
  20. elseif) {
  21. var
    function
    var

    ,

  22. true

    elseif) {

  23. var
    var
    var

    ,

  24. true

    elseif) {

  25. var
    var
    var,user);
  26. var, {
  27. ,
  28. false
    ,
  29. false
    true
    true
    true
    ,
  30. , {
  31. ,
  32. true

    var + user;

  33. var, {
  34. ,
  35. ,
  36. ,
  37. ,
  38. false

    function

  39. function
    var
    ifnull
    if

    new

  40. );
  41. else
    , );
  42. });

上面的代码就是页面完成加载后自动连接服务器,并创建展示界面的代码。

注意

需要注意的两点,在部署完成之后需要将在tomcat应用目录中的lib目录下的catalina.jar和tomcat-coyote.jar删掉,比
如项目的lib目录在D:\workspace\WebSocket\WebRoot\WEB-INF\lib,而部署的应用lib目录是在D:
\tools\apache-tomcat-7.0.32\webapps\WebSocket\WEB-INF\lib,删掉部署目录的lib目录中连
两个jar就可以了,否则会包Could
not initialize class com.ibcio.WebSocketMessageServlet错误,切记。

如果还是无法建立连接,请下载最新的tomcat,忘了是那个版本的tomcatcreateWebSocketInbound是没有request参数的,现在的这个代码是有这个参数了,7.0.3XX版本都是带这个参数的,切记。

总结

使用WebSocket开发服务器推送非常方便,这个是个简单的应用,其实还可以结合WebRTC实现视频聊天和语音聊天。在我的Leetop项目中已经实现了浏览器端视频聊天的功能,大家可以去看看 www.ibcio.com,在我的另外一篇文章中有详细的介绍:http://blog.csdn.net/leecho571/article/details/8207102,下图就是Leetop项目的效果图:

实例下载

下载地址:http://download.csdn.net/detail/leecho571/5854569

本文转自:http://blog.csdn.net/leecho571/article/details/9707497

基于Tomcat7、Java、WebSocket的服务器推送聊天室 (转),布布扣,bubuko.com

时间: 2024-12-24 22:23:28

基于Tomcat7、Java、WebSocket的服务器推送聊天室 (转)的相关文章

基于Tomcat7、Java、WebSocket的服务器推送聊天室

http://blog.csdn.net/leecho571/article/details/9707497 http://blog.fens.me/java-websocket-intro/ java EE 7 去年刚刚发布了JSR356规范,使得WebSocket的Java API得到了统一,Tomcat从7.0.47开始支持JSR356,这样一来写WebSocket的时候,所用的代码都是可以一样的. HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发

基于comet服务器推送技术(web实时聊天)

http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据. 主要思想:服务器端将数据推送到客户端(浏览器) 本人做了简单的web实时聊天系统:服务器推送(聊天).zip 系统简单说明如下: { 系统所用数据库:sqlite数据库 UserInfo:用户信息表 UserRelation:用户关系表 Mes

HTML5 服务器推送事件(Server-sent Events)实战开发

转自:http://www.ibm.com/developerworks/cn/web/1307_chengfu_serversentevent/ http://www.ibm.com/developerworks/cn/web/wa-lo-comet/     --comet长连接 服务器推送事件(Server-sent Events)是 HTML 5 规范中的一个组成部分,可以用来从服务端实时推送数据到浏览器端.相对于与之类似的 COMET 和 WebSocket 技术来说,服务器推送事件的

SSE技术详解:一种全新的HTML5服务器推送事件技术

前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events).关于这4种技术方式的优缺点,请参考<Web端即时通讯技术盘点:短轮询.Comet.Websocket.SSE>.本文将专门讲解SSE技术. 服务器推送事件(Server-sent Events),简称SSE,是 HTML 5 规范中的一个组成部分,可以用来从服务端

Spring之WebSocket网页聊天以及服务器推送

Spring之WebSocket网页聊天以及服务器推送 转自:http://www.xdemo.org/spring-websocket-comet/ /Springframework /Spring之WebSocket网页聊天以及服务器推送 1. WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex). 2. 轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端

服务器推送的实现—基于EventSource

一.服务器推送理解 首先要知道为什么使用服务器推送,回答这个问题其实就是相当于回答,服务器推送的优点,可以从两个方面来思考: 1.1 服务器推送的目的 及时的将客户端感兴趣的数据推送给它. 1.2 不是用服务器推送怎么来实现需求 不使用服务端推送,那就只能由客户端定期对服务器发送请求,来获取是否有需要的数据.这样做有几个缺点: 不能及时的获取,最大延时时间为轮询间隔. 浪费资源,大部分的请求,都不会得到数据 轮询间隔短会对服务器造成较大的压力. 1.3 使用服务器推送可以带来什么好处 我理解的有

服务器推送

WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,WebSocketAPI被W3C定为标准. 在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道.两者之间就直接可以数据互相传送. 背景 现在,很多网站为了实现推送技术,所用的技术都是轮询.轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然

Web端服务器推送技术原理分析及dwr框架简单的使用 转载

1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失. 但是,在浏览器中的 Ajax应用中存在一个致命的缺陷无法满足传统桌面系

ASP.NET Web实时消息后台服务器推送技术---GoEasy

越来越多的项目需要用到实时消息的推送与接收,怎样用ASP.NET现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等. 支持不同的开发语言:    GoEasy推送 提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过