基于tomcat的websocket说明文档_第1页
基于tomcat的websocket说明文档_第2页
基于tomcat的websocket说明文档_第3页
基于tomcat的websocket说明文档_第4页
基于tomcat的websocket说明文档_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Tomcat 版本:Tomcat7.0.27 及其以上 浏览器:Mozilla Firefox,Chromium 等,不支持 IE WebSockets 简介 WebSocket 是下一代 web 通信的协议,他有以下特点: 整页重新加载 使用 Ajax 处理重新加载组件 Comet 通信 类似于 AJAX,但在服务器上不长时间持有线程。 TCP 双向通信 上面罗列的每一种特性都有优点和缺点,Tomcat6 使用 Comet 处理机制通 过 HTTP 实现了双向通信。这种实现允许异步事件驱动和双向通信,但是这种实 现有一些限制: 由于 HTTP 是基于请求/相应的,不是一个双向协议,代理和其他的中介 机制可能无法正常运行,而且在任何特定的时间点,只能单向传输。 对于服务器端开发者来说,引入多线程开发模型会变得更加困难。 由于不是标准的 API,会导致没有统一接口。 Servlet3.0 引入了一个新的功能叫做异步 servlet,Servlet 接收到请求 之后,可能首先需要对请求携带的数据进行一些预处理;接着,Servlet 线程 将请求转交给一个异步线程来执行业务处理,线程本身返回至容器,此时 Servlet 还没有生成响应数据,异步线程处理完业务以后,可以直接生成响应 数据(异步线程拥有 ServletRequest 和 ServletResponse 对象的引用),或 者将请求继续转发给其它 Servlet。如此一来, Servlet 线程不再是一直处于 阻塞状态以等待业务逻辑的处理,而是启动异步线程之后可以立即返回。 这个特性要比 tomcat 的 comet 处理机制强大。而这是一个标准的 Servlet API,在其基础上建立通用开发框架是非常容易的。 异步的 servlet 虽然解决了一部分网络通信的需求,但是由于其缺乏双向 通信的支持,使其的适用范围仍然有限。 WebSocket 是另外一种尝试通过 HTTP 支持异步、事件驱动和双向通信的规 范协议。其标准化的一个形式是 JavaScript API。现在缺乏一个标准的服务器 端 API,Servlet3.1 的专家小组正在积极的研究对此的一些基层的支持,这也 是我写这篇文章的原因。 WebSocket 是否将演变成一个完整完备的 WebSocket API 仍有待观察。在 此期间主要的的 Servlet 容器都只是支持非标准的 API,Tomcat 也不例外。 示例 在 Tomcat7.0.27 版本中,apache 给出了 WebSocket 的实现,这项功能是很多 Tomcat 用户 一直期望的,而如今,这项功能有了。 第一个类,需要一个 Servlet 来处理 WebSocket 请求: MyWebSocketServlet.Java package com.yzkj.websocket; import javax.servlet.http.HttpServletRequest; import org.apache.catalina.websocket.StreamInbound; import org.apache.catalina.websocket.WebSocketServlet; public class MyWebSocketServlet extends WebSocketServlet /*与7.0.27不同的,Tomcat7.0.29改变了createWebSocketInbound方法的定义, 增加了一个HttpServletRequest参数,这样我们也可以从request参数中获取更 多请求方的信息*/ Override protected StreamInbound createWebSocketInbound(String arg0) System.out.println(“#“); return new MyMessageInbound(); 这个 Servlet 继承自 WebSocketServlet,实现 createWebSocketInbound 方法。 该方法返回第二个类的实例。 第二个类,处理每一次具体的 WebSocket 任务: MyMessageInbound.java package com.yzkj.websocket; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import org.apache.catalina.websocket.MessageInbound; import org.apache.catalina.websocket.WsOutbound; / 实现下面四个事件处理函数(其实onClose和onOpen有缺省实现) 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(); / getWsOutbound可以返回当前的WsOutbound,通过他向客户端回传数据,这里采用的 是nio的CharBuffer outbound.writeTextMessage(buffer); outbound.flush(); / WebSocket关闭事件,参数status应该来自 org.apache.catalina.websocket.Constants中定义的几个常量,可以参考文档或者核 对一下Tomcat的源码 Override protected void onClose(int status) InitServlet.getSocketList().remove(this); super.onClose(status); / WebSocket握手完成,创建完毕,WsOutbound用于向客户端发送数据 Override protected void onOpen(WsOutbound outbound) super.onOpen(outbound); InitServlet.getSocketList().add(this); 这个类继承自 MessageInbound 类,必须实现 onBinaryMessage 和 onTextMessage 方法。 还要一个初始化的 Servlet InitServlet.java package com.yzkj.websocket; 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 List socketList; public void init(ServletConfig config) throws ServletException InitServlet.socketList = new ArrayList(); super.init(config); System.out.println(“Server start=“); public static List getSocketList() return InitServlet.socketList; 最后,web.xml 中进行一下 Servlet 的配置。 mywebsocket com.yzkj.websocket.MyWebSocketServlet mywebsocket *.do initServlet com.yzkj.websocket.InitServlet 1 标准的 HTML5 的 websocket Index.html Index var ws = null; function startWebSocket() if (WebSocket in window) ws = new WebSocket(“ws:/localhost:8080/websocket/ mywebsocket.do“); / 设定WebSocket,注意协议是ws,请求是指向对应的WebSocketServlet的 / /websocket为网站的根目录,写错将不能访问 / 创建WebSocket实例,下面那个MozWebSocket是Firefox的实现 else if (MozWebSocket in window) ws = new MozWebSocket(“ws:/localhost:8080/websocket /mywebsocket.do“); else alert(“not support“); / 收到服务器发送的文本消息, event.data表示文本内容 ws.onmessage = function(evt) alert(evt.data); ; / 关闭WebSocket的回调 ws.onclose = function(evt) alert(“close“); ; / WebSocket握手完成,连接成功的回调 ws.onopen = function(evt) alert(“open“); ; / 通过WebSocket想向服务器发送一个文本信息 function sendMsg() ws.send(document.getElementById(writeMsg).value); 注意事项:需导入%TomcatHome%/lib 目录下的所有.jar 文件,运行时删除导入的.jar 文件或者在%tomcatHome%/conf/ context.xml 文件中加入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论