Tomcat实现WebSocket的方法

 更新时间:2016年11月30日 10:01:12   作者:汪洋之舟---seaboat  
WebSocket协议属于HTML5标准,越来越多浏览器已经原生支持WebSocket,它能让客户端和服务端实现双向通信。这篇文章主要介绍了Tomcat实现WebSocket的方法的相关资料,需要的朋友可以参考下

 WebSocket协议属于HTML5标准,越来越多浏览器已经原生支持WebSocket,它能让客户端和服务端实现双向通信。在客户端和服务器端建立一条WebSocket连接后,服务器端消息可直接发送到客户端,从而打破传统的请求响应模式,避免了无意义的请求。比如传统的方式可能会使用AJAX不断请求服务器端,而WebSocket则可以直接发送数据到客户端且客户端不必请求。同时,由于有了浏览器的原生支持,编写客户端应用程序也变得更加便捷且不必依赖第三方插件。另外,WebSocket协议摒弃了HTTP协议繁琐的请求头,而是以数据帧的方式进行传输,效率更高。

图为WebSocket协议通信的过程,首先客户端会发送一个握手包告诉服务器端我想升级成WebSocket,不知道你服务器端是否同意,这时如果服务器端支持WebSocket协议则会返回一个握手包告诉客户端没问题,升级已确认。然后就成功建立起了一条WebSocket连接,该连接支持双向通信,并且使用WebSocket协议的数据帧格式发送消息。

这里写图片描述

握手过程需要说明下,为了让WebSocket协议能和现有HTTP协议Web架构互相兼容,所以WebSocket协议的握手要基于HTTP协议,比如客户端会发送类似如下的HTTP报文到服务器端请求升级为WebSocket协议,其中包含的Upgrade: websocket就是告诉服务器端我想升级协议:

GET ws://localhost:8080/hello HTTP/1.1
Origin: http://localhost:8080
Connection: Upgrade
Host: localhost:8080
Sec-WebSocket-Key: uRovscZjNol/umbTt5uKmw==
Upgrade: websocket
Sec-WebSocket-Version: 13

此时如果服务器端支持WebSocket协议,则它会发送一个同意客户端升级协议的报文,具体报文类似如下,其中Upgrade: websocket就是告诉客户端我同意你升级协议:

HTTP/1.1 101 WebSocket Protocol Handshake
Date: Fri, 10 Feb 2016 17:38:18 GMT
Connection: Upgrade
Server: Kaazing Gateway
Upgrade: WebSocket
Sec-WebSocket-Accept: rLHCkw/SKsO9GAH/ZSFhBATDKrU=

完成如上握手后,HTTP协议连接就被打破,接下去则是开始使用WebSocket协议进行双方通信,这条连接还是原来的那条TCP/IP连接,端口也还是原来的80或443。

下面举一个Tomcat中编写WebSocket的简单例子:

public class HelloWebSocketServlet extends WebSocketServlet {
private static List<MessageInbound> socketList = new ArrayList<MessageInbound>();
protected StreamInbound createWebSocketInbound(String subProtocol,HttpServletRequest request){
return new WebSocketMessageInbound();
}
public class WebSocketMessageInbound extends MessageInbound{
protected void onClose(int status){
super.onClose(status);
socketList.remove(this); 
}
protected void onOpen(WsOutbound outbound){
super.onOpen(outbound);
socketList.add(this);
}
@Override
protected void onBinaryMessage(ByteBuffer message) throws IOException {
}
@Override
protected void onTextMessage(CharBuffer message) throws IOException {
for(MessageInbound messageInbound : socketList){
CharBuffer buffer = CharBuffer.wrap(message);
WsOutbound outbound = messageInbound.getWsOutbound();
outbound.writeTextMessage(buffer);
outbound.flush(); 
}
}
}
}

这个Servlet必须要继承WebSocketServlet,接着创建一个继承MessageInbound的WebSocketMessageInbound类,在该类中填充onClose、onOpen、onBinaryMessage和onTextMessage等方法即可完成各个事件的逻辑,其中onOpen会在一个WebSocket连接建立时被调用,onClose会在一个WebSocket关闭时被调用,onBinaryMessage则是Binary方式下接收到客户端数据时被调用,onTextMessage则是Text方式下接收到客户端数据时被调用。上面一段代码实现了一个广播的效果。

按照上面的处理逻辑,Tomcat对WebSocket的集成就不会太难了,就是在处理请求时如果遇到WebSocket协议请求则做特殊处理,保持住连接并在适当的时机调用WebSocketServlet的MessageInbound的onClose、onOpen、onBinaryMessage和onTextMessage等方法。由于WebSocket一般建议在NIO模式下使用,所以看看NIO模式集成WebSocket协议。

如图,对于WebSocket的客户端连接被接收器接收后注册到NioChannel队列中,Poller组件不断轮休是否有NioChannel需要处理,如果有则经过处理管道后进到继承了WebSocketServlet的Servlet上,WebSocketServlet的doGet方法会处理WebSocket握手,告诉返回客户端同意升级协议。往后Poller继续不断轮休相关NioChannel,一旦发现是使用WebSocket协议的管道则会调用MessageInbound的相关方法,完成不同事件的处理,从而实现对WebSocket协议的支持。

这里写图片描述

相关文章

  • Linux下Tomcat8如何修改JVM内存配置

    Linux下Tomcat8如何修改JVM内存配置

    这篇文章主要介绍了Linux下Tomcat8如何修改JVM内存配置问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Tomcat运行时在IDEA控制台输出信息中文乱码的解决方案

    Tomcat运行时在IDEA控制台输出信息中文乱码的解决方案

    本文主要给大家介绍Tomcat运行时在IDEA控制台输出信息中文乱码的解决方案,文中的解决方案介绍的非常详细,有需要的朋友可以参考阅读下
    2023-08-08
  • linux系统中修改tomcat默认输入日志路径的方法

    linux系统中修改tomcat默认输入日志路径的方法

    本文给大家介绍了linux系统中修改tomcat默认输入日志路径的方法,文中只是给大家介绍linux系统修改默认logs的方法,windows系统类似,需要的朋友可以参考下
    2018-03-03
  • 解决运行Tomcat之后仍然出现404的问题

    解决运行Tomcat之后仍然出现404的问题

    这篇文章主要介绍了解决运行Tomcat之后仍然出现404的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 在Windows10中安装TomCat的教程图解

    在Windows10中安装TomCat的教程图解

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。这篇文章主要介绍了在Windows10中安装TomCat的教程图解,需要的朋友可以参考下
    2019-11-11
  • 如何设置Tomcat的默认端口(图文)

    如何设置Tomcat的默认端口(图文)

    Tomcat安装时默认的端口设置的是8080,而http协议的默认端口是80,所以测试Tomcat时需要输入的网址为“http://localhost:8080”,若把Tomcat的端口设置为80,则直接输入“http://localhost”就能显示Tomcat默认主页,下面我们来分享下,方便需要的朋友
    2014-06-06
  • tomcat漏洞汇总

    tomcat漏洞汇总

    本文主要介绍了tomcat漏洞汇总,文中通过代码和示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 让IIS6支持JSP的设置方法(IIS完美整合Tomcat)

    让IIS6支持JSP的设置方法(IIS完美整合Tomcat)

    这方面的教程网上很多,多数是copy之后又copy,以至于有些细节一直含糊不清,也导致我走了许多弯路,今天脚本之家小编特为大家整理了一些方法,经测试正常运行jsp
    2014-07-07
  • Tomcat打破双亲委派机制实现隔离Web应用的方法

    Tomcat打破双亲委派机制实现隔离Web应用的方法

    本文主要介绍了Tomcat打破双亲委派机制实现隔离Web应用的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Eclipse添加Tomcat Server配置的方法步骤

    Eclipse添加Tomcat Server配置的方法步骤

    这篇文章主要介绍了Eclipse添加Tomcat Server配置的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09

最新评论