`
zengshaotao
  • 浏览: 792415 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于Tomcat的WebSocket

    博客分类:
  • java
 
阅读更多

原文地址:http://redstarofsleep.iteye.com/blog/1488639

 

2014年2月更新: 此API为Tomcat私有,当时Java没有标准API,现在Java有标准API,JSR536,此API不建议使用,新的用法请参照http://redstarofsleep.iteye.com/blog/1974620

 

之前大概的看过WebSocket,当时Tomcat还不支持WebSocket,所以当时写了一篇基于Jetty的WebSocket实现,地址如下:

http://redstarofsleep.iteye.com/blog/1307608

 

现在Tomcat7.0.27发布了,从这个版本开始Tomcat就支持WebSocket了。

Tomcat的WebSocket和Jetty的大致上差不多,大同小异,这里就简单的贴两个类吧(此例子未考虑多线程的情况):

 

第一个类,这个和Jetty一样,需要一个Servlet来处理WebSocket请求:

Java代码  收藏代码
  1. package lhc.websocket;  
  2.   
  3. import org.apache.catalina.websocket.StreamInbound;  
  4. import org.apache.catalina.websocket.WebSocketServlet;  
  5.   
  6. public class MyWebSocketServlet extends WebSocketServlet {  
  7.   
  8.     private static final long serialVersionUID = -7178893327801338294L;  
  9.   
  10.     @Override  
  11.     protected StreamInbound createWebSocketInbound(String arg0) {  
  12. System.out.println("##########");  
  13.         return new MyMessageInbound();  
  14.     }  
  15.   
  16. }  

这个Servlet继承自WebSocketServlet,实现createWebSocketInbound方法。该方法返回第二个类的实例。

 

第二个类,处理每一次具体的WebSocket任务:

Java代码  收藏代码
  1. package lhc.websocket;  
  2.   
  3. import java.io.IOException;  
  4. import java.nio.ByteBuffer;  
  5. import java.nio.CharBuffer;  
  6.   
  7. import lhc.init.InitServlet;  
  8.   
  9. import org.apache.catalina.websocket.MessageInbound;  
  10. import org.apache.catalina.websocket.WsOutbound;  
  11.   
  12. public class MyMessageInbound extends MessageInbound {  
  13.   
  14.     @Override  
  15.     protected void onBinaryMessage(ByteBuffer arg0) throws IOException {  
  16.         // TODO Auto-generated method stub  
  17.           
  18.     }  
  19.   
  20.     @Override  
  21.     protected void onTextMessage(CharBuffer msg) throws IOException {  
  22.         for (MessageInbound messageInbound : InitServlet.getSocketList()) {  
  23.             CharBuffer buffer = CharBuffer.wrap(msg);  
  24.             WsOutbound outbound = messageInbound.getWsOutbound();  
  25.             outbound.writeTextMessage(buffer);  
  26.             outbound.flush();  
  27.         }  
  28.           
  29.     }  
  30.   
  31.     @Override  
  32.     protected void onClose(int status) {  
  33.         InitServlet.getSocketList().remove(this);  
  34.         super.onClose(status);  
  35.     }  
  36.   
  37.     @Override  
  38.     protected void onOpen(WsOutbound outbound) {  
  39.         super.onOpen(outbound);  
  40.         InitServlet.getSocketList().add(this);  
  41.     }  
  42.       
  43.       
  44.   
  45. }  

 

 这个类继承自MessageInbound类,必须实现onBinaryMessage和onTextMessage方法。Jetty中只有一个onMessage方法,而Tomcat细化成了2个方法。

 

还要一个初始化的Servlet

Java代码  收藏代码
  1. package lhc.init;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import javax.servlet.ServletConfig;  
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9.   
  10. import org.apache.catalina.websocket.MessageInbound;  
  11.   
  12. public class InitServlet extends HttpServlet {  
  13.   
  14.     private static final long serialVersionUID = -3163557381361759907L;  
  15.       
  16.     private static List<MessageInbound> socketList;    
  17.       
  18.     public void init(ServletConfig config) throws ServletException {    
  19.         InitServlet.socketList = new ArrayList<MessageInbound>();    
  20.         super.init(config);    
  21.         System.out.println("Server start============");    
  22.     }    
  23.         
  24.     public static List<MessageInbound> getSocketList() {    
  25.         return InitServlet.socketList;    
  26.     }    
  27. }  

 

 

最后,web.xml中进行一下Servlet的配置。

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  
  3.   <display-name>wsoc</display-name>  
  4.   <welcome-file-list>  
  5.     <welcome-file>index.jsp</welcome-file>  
  6.   </welcome-file-list>  
  7.     
  8.   <servlet>  
  9.     <servlet-name>mywebsocket</servlet-name>  
  10.     <servlet-class>lhc.websocket.MyWebSocketServlet</servlet-class>  
  11.   </servlet>  
  12.   <servlet-mapping>  
  13.     <servlet-name>mywebsocket</servlet-name>  
  14.     <url-pattern>*.do</url-pattern>  
  15.   </servlet-mapping>  
  16.     
  17.   <servlet>  
  18.     <servlet-name>initServlet</servlet-name>  
  19.     <servlet-class>lhc.init.InitServlet</servlet-class>  
  20.     <load-on-startup>1</load-on-startup>  
  21.   </servlet>  
  22. </web-app>  

 

 

页面的话,就是标准的HTML5的websocket,这个和服务器是否是Tomcat或者Jetty是无关的:

Html代码  收藏代码
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html>  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>Index</title>  
  8. <script type="text/javascript">  
  9. var ws = null;  
  10. function startWebSocket() {  
  11.     if ('WebSocket' in window)  
  12.         ws = new WebSocket("ws://localhost:8080/wsoc/mywebsocket.do");  
  13.     else if ('MozWebSocket' in window)  
  14.         ws = new MozWebSocket("ws://localhost:8080/wsoc/mywebsocket.do");  
  15.     else  
  16.         alert("not support");  
  17.       
  18.       
  19.     ws.onmessage = function(evt) {  
  20.         alert(evt.data);  
  21.     };  
  22.       
  23.     ws.onclose = function(evt) {  
  24.         alert("close");  
  25.     };  
  26.       
  27.     ws.onopen = function(evt) {  
  28.         alert("open");  
  29.     };  
  30. }  
  31.   
  32. function sendMsg() {  
  33.     ws.send(document.getElementById('writeMsg').value);  
  34. }  
  35. </script>  
  36. </head>  
  37. <body onload="startWebSocket();">  
  38. <input type="text" id="writeMsg"></input>  
  39. <input type="button" value="send" onclick="sendMsg()"></input>  
  40. </body>  
  41. </html>  
分享到:
评论

相关推荐

    Tomcat WebSocket

    1. **WebSocket协议**:WebSocket基于TCP,通过HTTP/1.1的Upgrade头字段进行初始化,之后建立一个长期存在的连接,允许双向数据流。 2. **Tomcat的WebSocket支持**:Tomcat从7.0版本开始内置了对WebSocket的支持,...

    基于tomcat的websocket开发示例源码

    在这个基于Tomcat的WebSocket开发示例中,我们将深入探讨如何利用WebSocket技术来实现服务器与客户端之间的双向交互。 首先,我们需要确保运行环境满足要求,即Tomcat版本至少为7.0.47。Tomcat从7.0版本开始支持...

    基于Tomcat实现HTML5的WebSocket

    基于Tomcat实现WebSocket,首先需要确保Tomcat版本支持WebSocket。从Tomcat 7.0.27开始,Tomcat内建了对WebSocket的支持,它实现了JSR 356(Java API for WebSocket)规范。以下是实现步骤: 1. **创建WebSocket...

    基于Tomcat7、Java、Ext、WebSocket的聊天室

    这个项目是基于Tomcat7、Java、Ext和WebSocket构建的一个聊天室,旨在提供一个交互式的在线交流平台。下面将详细阐述这些技术及其在聊天室中的应用。 **Tomcat7**: Tomcat7是Apache软件基金会的Jakarta项目下的一...

    tomcat7.0.42 下部署websocket需要替换的包

    WebSocket的实现是基于Servlet API的扩展,因此更新这个文件可能包括了WebSocket的实现改进。 6. **tomcat-jdbc.jar**:与`tomcat-dbcp.jar`类似,处理WebSocket应用可能涉及的数据库连接。确保数据库操作的兼容性...

    websocket+tomcat+jetty+netty

    “tomcatWS-0.0.1-SNAPSHOT.war”看起来是一个基于Tomcat的Web应用程序的WAR(Web Archive)文件。WAR文件是Java Web应用的标准打包格式,包含了所有的静态资源、Servlet类、JSP文件等。在这个例子中,可能包含了...

    基于websocket的聊天室源码

    4. **配置文件**:如果项目使用了像Tomcat这样的应用服务器,可能还会包含一些配置文件,如`web.xml`,用于配置WebSocket服务。 5. **测试和运行**:项目可能包含一些测试类或者脚本来启动服务器和测试聊天功能。 ...

    基于jsp+Tomcat7.0.27以上版本+html5的websocket简单demo

    一个可以正常运行的websocket案例,初学者学习用吧, 由于websocket是在Tomcat7.0.27版本添加的,所以打包在tomcat中运行的时候,注意要删除tomcat中包含的自身jar包才能正常运行

    基于websocket的聊天室

    【基于WebSocket的聊天室】是一种实时通信技术的实现,它允许服务器与客户端进行双向通信,即数据可以在两者之间即时发送和接收,而无需反复建立新的HTTP连接。WebSocket协议是在HTML5中引入的,极大地优化了实时...

    基于spring websocket实现广播及点对点推送功能Demo

    基于spring websocket实现广播及点对点推送功能Demo。 开发环境:IntelliJ IDEA 2016.3.4 运行环境:jre1.8.0_131 服务器:Tomcat 8.5 测试步骤: 1.配置好环境,主要是maven和tomcat; 2.编译并运行,使用不同的...

    Tomcat7.0下实现的websocket 代码

    在Tomcat 7.0中,WebSocket的实现基于JSR 356规范,也称为Java API for WebSocket (JAWS)。 **1. 搭建环境** 要实现在Tomcat 7.0中的WebSocket,首先需要确保你的Tomcat服务器已经更新到支持WebSocket的版本。...

    基于websocket的web聊天室

    为了部署这个应用,可能需要一个Web服务器或应用服务器,如Tomcat,来运行Java WebSocket服务器。确保服务器配置正确,支持WebSocket,并能够部署包含`ChatServer`和前端资源的war文件。 总的来说,这个项目涵盖了...

    java 基于websocket实现的视频聊天

    Java基于WebSocket实现的视频聊天是一种实时通信(Real-Time Communication, RTC)的应用,它利用了WebSocket这一先进的网络协议来实现高效、双向的数据传输。WebSocket协议是HTML5的一个重要特性,为客户端与服务器...

    基于maven的websocket实例

    总之,这个基于Maven的WebSocket实例展示了如何利用Java、Maven和Tomcat7创建一个简单的WebSocket聊天应用。通过这种方式,开发者可以构建高度交互的Web应用程序,如在线游戏、实时股票报价、协作工具等,这些应用对...

    基于Websocket的简单聊天室

    总结来说,"基于Websocket的简单聊天室"项目利用了WebSocket提供实时通信的能力,结合Java的WebSocket API实现了服务器端点,Eclipse作为开发工具提供了便利的开发环境,而Tomcat8作为服务器承载并运行了这个应用。...

    java实现基于websocket的聊天室

    在Java中实现基于WebSocket的聊天室,我们需要掌握以下几个核心知识点: 1. **WebSocket协议**:WebSocket是HTML5定义的一种在单个TCP连接上进行全双工通信的协议。它提供了比HTTP更高效的数据传输方式,因为HTTP...

    基于websocket的即时通讯H5+App源码

    基于websocket的即时通讯H5+App源码, 环境:jdk1.8+ ,tomcat7+ ,mysql5.6+ 服务端:springboot+mybatis+mysql+maven 客户端:使用Hbuilder的mui框架实现的H5+App

    基于WebSocket+Tomcat7+HTML5的消息推送.zip

    Tomcat7是一个流行的开源Java Servlet容器,它可以运行基于Java的Web应用程序,包括WebSocket服务。 WebSocket API在HTML5规范中被引入,为Web开发者提供了一种在浏览器和服务器之间建立长连接的方法,从而实现实时...

Global site tag (gtag.js) - Google Analytics