深入拆解Tomcat & Jetty
李号双
eBay技术主管
立即订阅
6067 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | Java程序员如何快速成长?
免费
模块一 必备基础 (4讲)
01 | Web容器学习路径
02 | HTTP协议必知必会
03 | 你应该知道的Servlet规范和Servlet容器
04 | 实战:纯手工打造和运行一个Servlet
模块二 整体架构 (9讲)
05 | Tomcat系统架构(上): 连接器是如何设计的?
06 | Tomcat系统架构(下):聊聊多层容器的设计
07 | Tomcat如何实现一键式启停?
08 | Tomcat的“高层们”都负责做什么?
09 | 比较:Jetty架构特点之Connector组件
10 | 比较:Jetty架构特点之Handler组件
11 | 总结:从Tomcat和Jetty中提炼组件化设计规范
12 | 实战:优化并提高Tomcat启动速度
13 | 热点问题答疑(1):如何学习源码?
模块三 连接器 (9讲)
14 | NioEndpoint组件:Tomcat如何实现非阻塞I/O?
15 | Nio2Endpoint组件:Tomcat如何实现异步I/O?
16 | AprEndpoint组件:Tomcat APR提高I/O性能的秘密
17 | Executor组件:Tomcat如何扩展Java线程池?
18 | 新特性:Tomcat如何支持WebSocket?
19 | 比较:Jetty的线程策略EatWhatYouKill
20 | 总结:Tomcat和Jetty中的对象池技术
21 | 总结:Tomcat和Jetty的高性能、高并发之道
22 | 热点问题答疑(2):内核如何阻塞与唤醒进程?
模块四 容器 (8讲)
23 | Host容器:Tomcat如何实现热部署和热加载?
24 | Context容器(上):Tomcat如何打破双亲委托机制?
25 | Context容器(中):Tomcat如何隔离Web应用?
26 | Context容器(下):Tomcat如何实现Servlet规范?
27 | 新特性:Tomcat如何支持异步Servlet?
28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?
29 | 比较:Jetty如何实现具有上下文信息的责任链?
30 | 热点问题答疑(3):Spring框架中的设计模式
模块五 通用组件 (4讲)
31 | Logger组件:Tomcat的日志框架及实战
32 | Manager组件:Tomcat的Session管理机制解析
33 | Cluster组件:Tomcat的集群通信原理
特别放送 | 如何持续保持对学习的兴趣?
模块六 性能优化 (8讲)
34 | JVM GC原理及调优的基本思路
35 | 如何监控Tomcat的性能?
36 | Tomcat I/O和线程池的并发调优
37 | Tomcat内存溢出的原因分析及调优
38 | Tomcat拒绝连接原因分析及网络优化
39 | Tomcat进程占用CPU过高怎么办?
40 | 谈谈Jetty性能调优的思路
41 | 热点问题答疑(4): Tomcat和Jetty有哪些不同?
结束语 (1讲)
结束语 | 静下心来,品味经典
深入拆解Tomcat & Jetty
登录|注册

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

李号双 2019-06-20
我们知道 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(20)

  • z.l
    希望下一本能出《深入拆解netty》😄
    2019-06-23
    8
  • 吃饭饭
    为了跟现有的 HTTP 协议保持兼容,它通过 HTTP 协议进行一次握手,这里不应该是三次握手吗老师?不太明白这里,求讲解

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

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

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

    2019-06-25
    2
  • 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
    2
  • -W.LI-
    老师好!我有个问题可能有点蠢。spring对websocket有支持,还有STOMP这种。文中说websocket不是运行在severlet容器上的。spring上下文不是servlet容易下的一个子容器么?没有servlet容器的话,这个spring上下文注册去哪了啊?
    2019-06-23
    1
    1
  • foo
    老师,一直不太理解注解的作用及原理,在网上查到注解的目的是标识源代码元素的元数据,是否是源码中通过反射检测到注解后,实现了此注解的实际动作?如何查看此注解的实际动作呢?(描述有点乱,见谅)

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

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

    作者回复: 对的

    2019-06-20
    1
  • Geek_00d567
    特别的用户,需要知道用户和IP的映射关系吧。
    2019-09-19
  • 秋天
    向特定的用户发送消息 就在 endpoint 这段持有一个对应用户的一个 map结构,这样可以对于自己关心的用户就可以直接发送消息了
    2019-07-23
  • 双月鸟
    // 向聊天室中的每个用户广播消息
        private static void broadcast(String msg) {
            for (ChatAnnotation client : connections) {
                try {
                    synchronized (client) {
                        client.session.getBasicRemote().sendText(msg);
                    }
                } catch (IOException e) {
                  ...
                }
            }
        }
    为什么client要加synchronized,不加好像没影响
    2019-07-02
    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
  • Geek_9d8c59
    java版本的websocket客户端,websocket如果是分frame传输,不在意数据大小,为什么我把图片转换成base64,使用同步发送方法,会触发连接关闭。而把session的string消息类型的缓冲区设置的足够大之后,问题才消失。而后面在我加入了心跳包,重连机制后,当重连次数多了,为什么有时服务端会有大量tcp处于close-wait状态,然后日志开始报java heap内存不足的错误
    2019-06-20
  • andy
    老师您好,我有个tomcat spring mvc应用,需要提供一个接口供socket连接,我可以直接在应用服务层用netty编写一个监听端口来实现吗

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

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

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

    2019-06-20
  • IT橘子
    老师,在实际使用中,websocket和stomp over websocket优缺点如何?web在线聊天的语音或图片消息也是通过websocket实现,还是有其他技术?
    2019-06-20
  • 门窗小二
    通过从session中找到要发送的目标对象的信息!然后进行匹配发送
    2019-06-20
  • crazypokerk
    请问下老师,WebSocket和Servlet容器中处理请求的Servlet算是同一等级的组件吗?

    作者回复: 是的

    2019-06-20
  • 罗乾林
    向指定用户发送消息:添加登录机制,用户登录时维护用户id和session的关联关系。客户端向指定用户发送消息时指定用户id 发送给server,server通过用户id获取session转发消息
    2019-06-20
收起评论
20
返回
顶部