深入拆解 Tomcat & Jetty
李号双
eBay 技术主管
38890 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
深入拆解 Tomcat & Jetty
15
15
1.0x
00:00/00:00
登录|注册

18 | 新特性:Tomcat如何支持WebSocket?

UpgradeProcessor
ProtocolHandler
WebSocketContainer
SCI机制
注解式方式
编程式方式
服务器端Tomcat的实现代码
浏览器端JavaScript核心代码
WebSocket请求处理
WebSocket加载
Endpoint
WebSocket聊天室程序
数据传输
WebSocket协议
Socket
分享收获
提问与讨论
消化内容
向特定用户发送消息
HTTP协议升级成WebSocket协议
SCI技术扫描和加载WebSocket的处理类
Tomcat可以主动向浏览器推送数据
WebSocket技术实现了Tomcat与浏览器的双向通信
Tomcat如何支持WebSocket
WebSocket工作原理
课后思考
本期精华
Tomcat支持WebSocket

该思维导图由 AI 生成,仅供参考

我们知道 HTTP 协议是“请求 - 响应”模式,浏览器必须先发请求给服务器,服务器才会响应这个请求。也就是说,服务器不会主动发送数据给浏览器。
对于实时性要求比较的高的应用,比如在线游戏、股票基金实时报价和在线协同编辑等,浏览器需要实时显示服务器上最新的数据,因此出现了 Ajax 和 Comet 技术。Ajax 本质上还是轮询,而 Comet 是在 HTTP 长连接的基础上做了一些 hack,但是它们的实时性不高,另外频繁的请求会给服务器带来压力,也会浪费网络流量和带宽。于是 HTML5 推出了 WebSocket 标准,使得浏览器和服务器之间任何一方都可以主动发消息给对方,这样服务器有新数据时可以主动推送给浏览器。
今天我会介绍 WebSocket 的工作原理,以及作为服务器端的 Tomcat 是如何支持 WebSocket 的。更重要的是,希望你在学完之后可以灵活地选用 WebSocket 技术来解决实际工作中的问题。

WebSocket 工作原理

WebSocket 的名字里带有 Socket,那 Socket 是什么呢?网络上的两个程序通过一个双向链路进行通信,这个双向链路的一端称为一个 Socket。一个 Socket 对应一个 IP 地址和端口号,应用程序通常通过 Socket 向网络发出请求或者应答网络请求。Socket 不是协议,它其实是对 TCP/IP 协议层抽象出来的 API。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Tomcat支持WebSocket的工作原理及实现方式 WebSocket技术在实现Tomcat与浏览器的双向通信方面发挥着重要作用。通过Tomcat的WebSocket API,开发者可以轻松实现WebSocket的功能,包括处理连接、消息传输等。WebSocket的工作原理类似于Socket,通过HTTP协议进行一次握手后,数据就直接从TCP层的Socket传输,与HTTP协议无关。浏览器和服务器在握手时会带上特定的请求头,如果服务器支持WebSocket,会在HTTP响应中加上相应的头部,从而建立WebSocket连接。数据传输以frame形式传输,可以分片传输大数据,提高传输效率。 Tomcat通过SCI机制完成WebSocket加载,构造一个WebSocketContainer实例,将扫描到的Endpoint子类和添加了注解`@ServerEndpoint`的类注册到这个容器中,并且这个容器还维护了URL到Endpoint的映射关系,这样通过请求URL就能找到具体的Endpoint来处理WebSocket请求。当WebSocket的握手请求到来时,Tomcat通过一个特殊的Filter判断该当前HTTP请求是否是一个WebSocket Upgrade请求,如果是,则在HTTP响应里添加WebSocket相关的响应头信息,并进行协议升级。具体来说就是用UpgradeProtocolHandler替换当前的HttpProtocolHandler,相应的,把当前Socket的Processor替换成UpgradeProcessor,同时Tomcat会创建WebSocket Session实例和Endpoint实例,并跟当前的WebSocket连接一一对应起来。这个WebSocket连接不会立即关闭,并且在请求处理中,不再使用原有的HttpProcessor,而是用专门的UpgradeProcessor,UpgradeProcessor最终会调用相应的Endpoint实例来处理请求。 总的来说,Tomcat作为服务器端支持WebSocket,通过特定的配置和实现WebSocket处理器,使得开发者可以灵活地选用WebSocket技术来解决实际工作中的问题,如在线游戏、股票基金实时报价和在线协同编辑等应用场景。WebSocket技术实现了Tomcat与浏览器的双向通信,Tomcat可以主动向浏览器推送数据,

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Tomcat & Jetty 》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(34)

  • 最新
  • 精选
  • 吃饭饭
    为了跟现有的 HTTP 协议保持兼容,它通过 HTTP 协议进行一次握手,这里不应该是三次握手吗老师?不太明白这里,求讲解

    作者回复: 这里的握手是指应用协议层,不是tcp层。握手的时候tcp连接已经建立,就是http请求里带有websocket的请求头,服务端回复也带有websocket的响应头。

    2019-06-20
    24
  • QQ怪
    之前做过相关websocket服务的相关设计,只要把登陆对象用户标识作为key,websocketsessionid作为value缓存成map集合,通过key找到websocketsessionId发送即可,利用的是spring websocket,但我有一点不太清楚的是:我听说单机tomcat能容纳5万客户端,我不知道为啥会是这个数,为啥不是更多呢?我在开发过程中其实压根就没到过这么大,我想知道是什么因素影响着最大容量数?还有就是想问websocket会不会存在并发问题?希望老师能够解答我的困惑,感谢!!!

    作者回复: 5万感觉是Linux上一个进程打开的文件数限制,Linux把Socket也看作是一个文件。 并发数没上去要看资源瓶颈在哪,内存,CPU或者带宽,一般大量链接需要耗费内存,还有就是Tomcat的最大连接数和最大线程数设置大了没有。 你的Websocket应用访问了全局变量就有并发问题,Tomcat层面不会有全局锁的瓶颈。 你说的并发是指线程安全吗,要看websocket

    2019-06-20
    11
  • WL
    老师能否讲一下tomcat在https中如何实现与客户端协商密钥的, 我感觉这个过程比较复杂, 涉及到两边的交互比较多,还有TrustManager的机制也没太看懂.

    作者回复: 建议你用openssl s_client -connect www.xxx.com:443,看看ssl握手过程,再结合网上的文章来学习

    2019-06-25
    8
  • Liam
    维护一个全局用户连接字典,建立连接时,将用户连接加入字典,发送消息时,从字典获取特定用户的连接并发送 ?

    作者回复: 对的

    2019-06-20
    5
  • andy
    老师您好,我有个tomcat spring mvc应用,需要提供一个接口供socket连接,我可以直接在应用服务层用netty编写一个监听端口来实现吗

    作者回复: 可以的,端口不冲突就行

    2019-06-20
    1
  • 小满爹
    老师,请问下对于插拔网线导致连接断开,websocket的服务端或客户端,可以监听到这个事件吗?是不是还需要程序做一些补偿机制?

    作者回复: socket连接是TCP传输层负责维护的,WebSocket是应用层协议,实际不管这个。

    2019-06-20
    1
  • Focused
    老师,一直不太理解注解的作用及原理,在网上查到注解的目的是标识源代码元素的元数据,是否是源码中通过反射检测到注解后,实现了此注解的实际动作?如何查看此注解的实际动作呢?(描述有点乱,见谅)

    作者回复: 是的,查找注解的实际动作可以在代码中全文搜索注解的关键字

    2019-06-20
    2
    1
  • Geek_28b75e
    老师,测试环境遇到一个问题,本项目使用springcloud,网管使用zuul。我在网关路由之前的过滤器添加了一个请求头,添加之后对于一般接口的路由转发是正常的,其中对于文件上传接口,我断点查看,需要好几秒才转发过去,并且报异常,org.apache.tomcat.util.http.fileupload.FileUploadException: Unexpected EOF read on the socket] with root cause java.io.EOFException: Unexpected EOF read on the socket 去掉那个请求头又是正常的,麻烦老师给解惑一下

    作者回复: 建议抓包分析

    2019-06-21
  • Cy190622
    老师,晚上好。 请教一下, 1.每节都有课后思考题,老师能否在下一节安排解答一下,或者是安排统一的解答章节嘛? 2.netty现在使用很流行。常用在生产上,咱们的课程是否会安排一节,讲一下;如果没有安排的,老师有没有推荐的书籍或者帖子。

    作者回复: 后面会有统一的答疑篇,Netty In Action 不错。

    2019-06-20
  • 杨俊
    tomcat nodejs在websocket性能上哪个好呢

    作者回复: netty最好 :)

    2019-06-20
收起评论
显示
设置
留言
34
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部