原文地址: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请求:
- package lhc.websocket;
- import org.apache.catalina.websocket.StreamInbound;
- import org.apache.catalina.websocket.WebSocketServlet;
- public class MyWebSocketServlet extends WebSocketServlet {
- private static final long serialVersionUID = -7178893327801338294L;
- @Override
- protected StreamInbound createWebSocketInbound(String arg0) {
- System.out.println("##########");
- return new MyMessageInbound();
- }
- }
这个Servlet继承自WebSocketServlet,实现createWebSocketInbound方法。该方法返回第二个类的实例。
第二个类,处理每一次具体的WebSocket任务:
- package lhc.websocket;
- import java.io.IOException;
- import java.nio.ByteBuffer;
- import java.nio.CharBuffer;
- import lhc.init.InitServlet;
- import org.apache.catalina.websocket.MessageInbound;
- import org.apache.catalina.websocket.WsOutbound;
- public class MyMessageInbound extends MessageInbound {
- @Override
- protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
- // TODO Auto-generated method stub
- }
- @Override
- protected void onTextMessage(CharBuffer msg) throws IOException {
- for (MessageInbound messageInbound : InitServlet.getSocketList()) {
- CharBuffer buffer = CharBuffer.wrap(msg);
- WsOutbound outbound = messageInbound.getWsOutbound();
- outbound.writeTextMessage(buffer);
- outbound.flush();
- }
- }
- @Override
- protected void onClose(int status) {
- InitServlet.getSocketList().remove(this);
- super.onClose(status);
- }
- @Override
- protected void onOpen(WsOutbound outbound) {
- super.onOpen(outbound);
- InitServlet.getSocketList().add(this);
- }
- }
这个类继承自MessageInbound类,必须实现onBinaryMessage和onTextMessage方法。Jetty中只有一个onMessage方法,而Tomcat细化成了2个方法。
还要一个初始化的Servlet
- package lhc.init;
- import java.util.ArrayList;
- import java.util.List;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import org.apache.catalina.websocket.MessageInbound;
- public class InitServlet extends HttpServlet {
- private static final long serialVersionUID = -3163557381361759907L;
- private static List<MessageInbound> socketList;
- public void init(ServletConfig config) throws ServletException {
- InitServlet.socketList = new ArrayList<MessageInbound>();
- super.init(config);
- System.out.println("Server start============");
- }
- public static List<MessageInbound> getSocketList() {
- return InitServlet.socketList;
- }
- }
最后,web.xml中进行一下Servlet的配置。
- <?xml version="1.0" encoding="UTF-8"?>
- <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">
- <display-name>wsoc</display-name>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <servlet-name>mywebsocket</servlet-name>
- <servlet-class>lhc.websocket.MyWebSocketServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>mywebsocket</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
- <servlet>
- <servlet-name>initServlet</servlet-name>
- <servlet-class>lhc.init.InitServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- </web-app>
页面的话,就是标准的HTML5的websocket,这个和服务器是否是Tomcat或者Jetty是无关的:
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Index</title>
- <script type="text/javascript">
- var ws = null;
- function startWebSocket() {
- if ('WebSocket' in window)
- ws = new WebSocket("ws://localhost:8080/wsoc/mywebsocket.do");
- else if ('MozWebSocket' in window)
- ws = new MozWebSocket("ws://localhost:8080/wsoc/mywebsocket.do");
- else
- alert("not support");
- ws.onmessage = function(evt) {
- alert(evt.data);
- };
- ws.onclose = function(evt) {
- alert("close");
- };
- ws.onopen = function(evt) {
- alert("open");
- };
- }
- function sendMsg() {
- ws.send(document.getElementById('writeMsg').value);
- }
- </script>
- </head>
- <body onload="startWebSocket();">
- <input type="text" id="writeMsg"></input>
- <input type="button" value="send" onclick="sendMsg()"></input>
- </body>
- </html>
相关推荐
1. **WebSocket协议**:WebSocket基于TCP,通过HTTP/1.1的Upgrade头字段进行初始化,之后建立一个长期存在的连接,允许双向数据流。 2. **Tomcat的WebSocket支持**:Tomcat从7.0版本开始内置了对WebSocket的支持,...
在这个基于Tomcat的WebSocket开发示例中,我们将深入探讨如何利用WebSocket技术来实现服务器与客户端之间的双向交互。 首先,我们需要确保运行环境满足要求,即Tomcat版本至少为7.0.47。Tomcat从7.0版本开始支持...
基于Tomcat实现WebSocket,首先需要确保Tomcat版本支持WebSocket。从Tomcat 7.0.27开始,Tomcat内建了对WebSocket的支持,它实现了JSR 356(Java API for WebSocket)规范。以下是实现步骤: 1. **创建WebSocket...
这个项目是基于Tomcat7、Java、Ext和WebSocket构建的一个聊天室,旨在提供一个交互式的在线交流平台。下面将详细阐述这些技术及其在聊天室中的应用。 **Tomcat7**: Tomcat7是Apache软件基金会的Jakarta项目下的一...
WebSocket的实现是基于Servlet API的扩展,因此更新这个文件可能包括了WebSocket的实现改进。 6. **tomcat-jdbc.jar**:与`tomcat-dbcp.jar`类似,处理WebSocket应用可能涉及的数据库连接。确保数据库操作的兼容性...
“tomcatWS-0.0.1-SNAPSHOT.war”看起来是一个基于Tomcat的Web应用程序的WAR(Web Archive)文件。WAR文件是Java Web应用的标准打包格式,包含了所有的静态资源、Servlet类、JSP文件等。在这个例子中,可能包含了...
4. **配置文件**:如果项目使用了像Tomcat这样的应用服务器,可能还会包含一些配置文件,如`web.xml`,用于配置WebSocket服务。 5. **测试和运行**:项目可能包含一些测试类或者脚本来启动服务器和测试聊天功能。 ...
一个可以正常运行的websocket案例,初学者学习用吧, 由于websocket是在Tomcat7.0.27版本添加的,所以打包在tomcat中运行的时候,注意要删除tomcat中包含的自身jar包才能正常运行
【基于WebSocket的聊天室】是一种实时通信技术的实现,它允许服务器与客户端进行双向通信,即数据可以在两者之间即时发送和接收,而无需反复建立新的HTTP连接。WebSocket协议是在HTML5中引入的,极大地优化了实时...
基于spring websocket实现广播及点对点推送功能Demo。 开发环境:IntelliJ IDEA 2016.3.4 运行环境:jre1.8.0_131 服务器:Tomcat 8.5 测试步骤: 1.配置好环境,主要是maven和tomcat; 2.编译并运行,使用不同的...
在Tomcat 7.0中,WebSocket的实现基于JSR 356规范,也称为Java API for WebSocket (JAWS)。 **1. 搭建环境** 要实现在Tomcat 7.0中的WebSocket,首先需要确保你的Tomcat服务器已经更新到支持WebSocket的版本。...
为了部署这个应用,可能需要一个Web服务器或应用服务器,如Tomcat,来运行Java WebSocket服务器。确保服务器配置正确,支持WebSocket,并能够部署包含`ChatServer`和前端资源的war文件。 总的来说,这个项目涵盖了...
Java基于WebSocket实现的视频聊天是一种实时通信(Real-Time Communication, RTC)的应用,它利用了WebSocket这一先进的网络协议来实现高效、双向的数据传输。WebSocket协议是HTML5的一个重要特性,为客户端与服务器...
总之,这个基于Maven的WebSocket实例展示了如何利用Java、Maven和Tomcat7创建一个简单的WebSocket聊天应用。通过这种方式,开发者可以构建高度交互的Web应用程序,如在线游戏、实时股票报价、协作工具等,这些应用对...
总结来说,"基于Websocket的简单聊天室"项目利用了WebSocket提供实时通信的能力,结合Java的WebSocket API实现了服务器端点,Eclipse作为开发工具提供了便利的开发环境,而Tomcat8作为服务器承载并运行了这个应用。...
在Java中实现基于WebSocket的聊天室,我们需要掌握以下几个核心知识点: 1. **WebSocket协议**:WebSocket是HTML5定义的一种在单个TCP连接上进行全双工通信的协议。它提供了比HTTP更高效的数据传输方式,因为HTTP...
基于websocket的即时通讯H5+App源码, 环境:jdk1.8+ ,tomcat7+ ,mysql5.6+ 服务端:springboot+mybatis+mysql+maven 客户端:使用Hbuilder的mui框架实现的H5+App
Tomcat7是一个流行的开源Java Servlet容器,它可以运行基于Java的Web应用程序,包括WebSocket服务。 WebSocket API在HTML5规范中被引入,为Web开发者提供了一种在浏览器和服务器之间建立长连接的方法,从而实现实时...