原文地址: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>
相关推荐
要求tomcat7.0.47以上
基于Tomcat实现HTML5的WebSocket 使用工程前先阅读使用说明!
项目可以直接导入,一个基于Tomcat7、Java、Ext、WebSocket的聊天室,分数是3分,目的不是为了赚分,是为了大家能够评论,提出意见。
一个可以正常运行的websocket案例,初学者学习用吧, 由于websocket是在Tomcat7.0.27版本添加的,所以打包在tomcat中运行的时候,注意要删除tomcat中包含的自身jar包才能正常运行
基于spring websocket实现广播及点对点推送功能Demo。 开发环境:IntelliJ IDEA 2016.3.4 运行环境:jre1.8.0_131 服务器:Tomcat 8.5 测试步骤: 1.配置好环境,主要是maven和tomcat; 2.编译并运行,使用不同的...
java 基于websocket实现的视频聊天,解压项目到对应位置部署到tomcat8即可使用
基于websocket的即时通讯H5+App源码, 环境:jdk1.8+ ,tomcat7+ ,mysql5.6+ 服务端:springboot+mybatis+mysql+maven 客户端:使用Hbuilder的mui框架实现的H5+App
本工程是java 实现tomcat自带的websocket信息交互案例,基于maven构建的。
需要用tomcat7.0和jdk7.0以上才能运行,很简单的一个,有详细注释,方便阅读,
基于Websocket 和Java的简单的聊天室,使用Eclipse开发, 服务器为Tomcat8。
基于tomcat的websocket,实现的一对一通讯,支持https协议。
基于springmvc框架搭建的websocket及时聊天,配置了登陆拦截,代码简单易懂,代码基本运行环境是jdk1.7+tomcat,无需配置其他即可使用
用websocket之后可以让前端和和后端像C/S模式...然推出了websocket,作为现在主流的Java肯定也有相应的支持,所以在JavaEE7之后也对websocket做出了规范,所以本次的代码理论上是要运行在Java1.7+和Tomcat7.0+之上的。
基于websocket的一个匿名聊天室 用的java+tomacat
broheim (布罗海姆)布罗海姆是一个基于tomcat-websocket-api的二次封装。再原有websocket之上封装了基于心跳检查、断线重连特性。解决了原有websocket网络状况感知不明显的问题。同时也结合SpringBoot的特性封装了...
一直钟情于spring,前段时间自己整了一套基于spring动态添加多数据源,动态切换多数据源(分库会用到)。废话不多说,回归正题。此次主要了解,整合的是spring websocket。在最开始的时候,碰到挺多问题的,不是连接...
1、什么是WebSocket? WebSocket 是一种自然的全双工、双向、单套接字连接。使用WebSocket,你的HTTP 请求变成打开WebSocket 连接(WebSocket 或者WebSocket over TLS(TransportLayer Security,传输层安全性,原称...