当前位置: 首页 > 编程笔记 >

Tomcat 实现WebSocket详细介绍

董良策
2023-03-14
本文向大家介绍Tomcat 实现WebSocket详细介绍,包括了Tomcat 实现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协议的支持。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 类似资料:
  • 本文向大家介绍Tomcat目录结构详细介绍,包括了Tomcat目录结构详细介绍的使用技巧和注意事项,需要的朋友参考一下 打开tomcat的解压之后的目录可以看到如下的目录结构: 1.Tomcat的bin目录: bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令)。 很多环境变量的设置都在此处,例如可以设置J

  • 本文向大家介绍Tomcat 日志切割(logrotate)详细介绍,包括了Tomcat 日志切割(logrotate)详细介绍的使用技巧和注意事项,需要的朋友参考一下 Tomcat 日志切割 logrotate是个强大的系统软件,它对日志文件有着一套完整的操作模式,譬如:转储、邮件和压缩等,并且默认logrotate加到cron(/etc/cron.daily/logrotate)作为每日任务执行

  • 本文向大家介绍Go 实现热重启的详细介绍,包括了Go 实现热重启的详细介绍的使用技巧和注意事项,需要的朋友参考一下 最近在优化公司框架 trpc 时发现了一个热重启相关的问题,优化之余也总结沉淀下,对 go 如何实现热重启这方面的内容做一个简单的梳理。 1.什么是热重启? 热重启(Hot Restart),是一项保证服务可用性的手段。它允许服务重启期间,不中断已经建立的连接,老服务进程不再接受新连

  • 本文向大家介绍Jenkins 关闭和重启详细介绍及实现,包括了Jenkins 关闭和重启详细介绍及实现的使用技巧和注意事项,需要的朋友参考一下 Jenkins 关闭和重启 我们用jar -jar jenkins.war来启动jenkins服务器,那么我们如何关闭或者重启jenkins服务器呢?经过搜索找到了相应的方法. 关闭jenkins服务 只需要在访问jenkins服务器的网址url地址后加上

  • 本文向大家介绍php  单例模式详细介绍及实现源码,包括了php  单例模式详细介绍及实现源码的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了PHP中数据库单例模式的实现代码分享,本文先是讲解了单例模式的一些知识,然后给出了数据库单例模式实现代码。 什么是单例模式 单例模式顾名思义,就是只有一个实例。 作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提

  • 本文向大家介绍C语言 栈的表示和实现详细介绍,包括了C语言 栈的表示和实现详细介绍的使用技巧和注意事项,需要的朋友参考一下 C语言 栈的表示和实现详细介绍 定义:栈是限定仅在表尾进行插入和删除操作的线性表。 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第

  • 本文向大家介绍详解spring boot实现websocket,包括了详解spring boot实现websocket的使用技巧和注意事项,需要的朋友参考一下 前言 QQ这类即时通讯工具多数是以桌面应用的方式存在。在没有websocket出现之前,如果开发一个网页版的即时通讯应用,则需要定时刷新页面或定时调用ajax请求,这无疑会加大服务器的负载和增加了客户端的流量。而websocket的出现,则

  • 本文向大家介绍Mysql Explain 详细介绍,包括了Mysql Explain 详细介绍的使用技巧和注意事项,需要的朋友参考一下 Mysql Explain 这里做一个资料的全面整理。 一.语法 explain < table_name > 例如: explain select * from t3 where id=3952602; 二.explain输出解释 +----+---------