基于Tomcat的WebSocket(5月8日更新)

来源:互联网 发布:下载不了软件怎么办 编辑:程序博客网 时间:2024/05/09 09:26

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;@Overrideprotected 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 {@Overrideprotected void onBinaryMessage(ByteBuffer arg0) throws IOException {// TODO Auto-generated method stub}@Overrideprotected 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();}}@Overrideprotected void onClose(int status) {InitServlet.getSocketList().remove(this);super.onClose(status);}@Overrideprotected 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");elsealert("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>

 

 转载请注明出处

2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 生完小孩肚子瘦不下来怎么办 胆子小一个人在家里都害怕怎么办 怀了双胞胎两个宝宝很挤怎么办 飞机无人陪护如果接机延误该怎么办 过年要坐火车回家 狗狗怎么办 一岁八个月宝宝小腿弯怎么办 2岁宝不愿意坐马桶拉屎怎么办 宝宝两岁多肺炎出院还老咳嗽怎么办 去外国机场买机票不会说外语怎么办 坐飞机不能带的物品办理托运怎么办 深圳外地户口儿童要办身份证怎么办 网上订票错写了护照号怎么办 国航 在智能火车票订飞机票订反了怎么办 办社保卡的时候填错地址怎么办 两个人住酒店只有一张身份证怎么办 农村社保卡信息错了说改不了怎么办 社保卡与原医保卡信息错误怎么办 学校发的社保卡丢了怎么办 魔棒工具选中选区后再怎么办 微信每次打开都出现月球图案怎么办 仙人掌的刺扎手里弄不出来怎么办 保险交满15年领了一年死了怎么办 狗咬了出了点血怎么办 被小狗咬到了吃了海鲜怎么办 想给一个人道歉又不敢说怎么办 被尘封的故事中魔法师不见了怎么办 宝骏5602挡升3挡有点卡怎么办 剥开的榴莲没熟壳又扔了怎么办 视频播放器激活码设备超限了怎么办 ai如何把右边菜单栏隐藏了怎么办 矫正牙齿粘牙齿的胶掉了怎么办 3m双面胶生产的时候胶不干怎么办 新房赠送面积没地热想接地热怎么办 教育网注册报名的用户名忘了怎么办 艺术生校考通过文化没过本线怎么办 想做主持人 但不是播音专业怎么办 微信登录版本最低登录不上怎么办 所录微课的视频声音小是怎么办 电脑开机黑屏只有光标在闪怎么办 联想家悦重装系统时驱动缺失怎么办 ps做到一半电脑重启了怎么办