Tomcat 7的WebSocket实现

jopen 10年前

本文覆盖了以下内容:

1)Web通信的演进

2)WebSocket

3)WebSocket在Apache Tomcat 7的实现

4)怎样用Jaggery开发WebSocket特性

Tomcat 7中引入了WebSocket实现。下面我们先了解WebSocket的优缺点,其次简要介绍Apache Tomcat 7的WebSocket实现。

WebSocket的演进过程如图所示:

Tomcat 7的WebSocket实现

要知道在Tomcat 6中要实现双向HTTP通信,需要使用Tomcat的Comet处理模块。Comet有以下局限:

1)HTTP协议本身是请求/响应协议,而不是双向协议

2)代理和其它中间媒介不会工作的很好

3)在任何给定的时间只有某个方向的数据包传输

4)Servlet开发者要使用多线程很难

Servlet 3.0版引入了一个新特征:异步Servlet。我们把它与客户端的Ajax调用进行比较。异步Servlet会把请求悬挂起,直到响应准备好交付,无需在容器中使用worker线程。WebSockets是另一个尝试标准化的技术,它支持HTTP之上的异步、事件驱动和全双工通信。

WebSocket给我们带来了如下特性:

1)通过升级/交换HTTP协议,在HTTP之上提供全双工通信

2)基于消息/帧的通信

3)可以与代理和中间媒介一起工作

4)还可以不与代理和中间媒介一起工作

WebSocket的优点:

1)WebSocket是理想的,客户端和服务器之间不再需要长期运行的会话

2)WebSocket是HTTP协议之上的全双工通信

3)由于WebSocket是HTTP握手初始化之后的TCP之上的协议,所以你只需做两件事:

发送消息

接收消息

下面来看一下WebSocket的交互情况:

f2.png
1)头部“Connection:upgrade”
2)响应包含关键状态码101
3)表明协议交换已经证明

在客户端和服务器之间的握手协议完成后,抛弃请求/响应通信,彼此开始独立的互发消息。下面是我的帧:

f3.png

Tomcat是怎样实现WebSocket的
1)要开始使用WebSocket,你必须继承Tomcat的WebSocket类
2)编写自己的类,它继承WebSocketServlet类(由于这是一个Servlet,因此必须把它映射到URL)
3)实现一个消息监听器类,由于它继承自WebSocketServlet类,因此需要自己实现createWebSocketInbound()方法

此方法能够用于监听事件。有两个必须有的方法:
一是 protected void onBinaryData(InputStream inStream);
二是protected void onTextData(Reader reader);

当WebSocket打开或关闭时,如果你希望收到通知,只需简单地重写onOpen()方法和onClose()方法。

    @Override        protected void onOpen(WsOutbound outbound);        @Override        protected void onClose(int status);  
</div> </div> 把数据写到客户端
必须有StreamInbound实现类,它会引用发送器组件WsOutbound,可以简单地通过调用来取到它:
myStreamInbound.getWsOutbound()  

还可以发送二进制数据
    public void writeBinaryData(int b);        public void writeBinaryMessage(ByteBuffer msgBb);  
</div> </div> 或者发送文本数据到客户端
    public void writeTextData(char c);        public void writeTextMessage(CharBuffer msgBb);  
</div> </div>

注意:这些方法是互斥的。不要同时调用两种方法,以期待既发送二进制数据,又发送文本数据。

关闭客户端连接

关闭通道有两种方式,分为clean方式和not clean方式。clean方式意味着已经通过TCP完成了握手协议。not clean方式意味着TCP连接被断开,先于握手的关闭。

Jaggery WebSocket实现

下面是Jaggery WebSocket实现的序列图:

f4.png

来自:http://blog.csdn.net/chszs/article/details/20153123