SSE suffers from a limitation to the maximum number of open connections, which can be specially painful when opening various tabs as the limit is per browser and set to a very low number (6). The issue has been marked as "Won't fix" in Chrome and Firefox
另外 HTTP/2 提供了服务器推送(Server Push)的功能,千万别和上面几个东西搞混了,完全不是一回事。服务器指的是 web 服务器,推送的对象是浏览器要加载的资源,是用于提升首屏加载速度的技术,需要在 web 服务器(比如 Nginx)中开启相关配置。可以参考这篇:https://www.cnblogs.com/wetest/p/8040202.html
com.tehang.callcenter.application.websocket.WebSocketConnection.onError
java.io.EOFException: null
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1208)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1142)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:834)
1 WebSocket 是什么
WebSocket 是 HTML5 新增的在单个 TCP 连接上进行 全双工通讯(不受限的双向通信)的协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
Websocket 使用和 HTTP 相同的 TCP 端口,可以绕过大多数防火墙的限制。默认情况下,Websocket 协议使用 80 端口;运行在
TLS
上则使用 443 端口。2 为什么要用 WebSocket
2.1 需求描述、应用场景
2.2 常用解决方案对比
WebSocket 能解决上述需求,除此之外,常用的解决方案还有:轮询、长轮询。另外 Html5 还提供了
Server-Sent Event
。Server-Sent Event
:Html5 提供的,借用了长轮询的思想,但不再每个连接只收发一个消息,将文本数据换成流以实现重复在一个连接上收发消息;3 WebSocket 连接建立过程
3.1 浏览器发起一个 http 请求建立连接
请求地址以
ws://
开头,请求头Upgrade: websocket
和Connection: Upgrade
表示这个连接将要被转换为 WebSocket 连接。3.2 服务器响应请求
响应头
HTTP/1.1 101 Switching Protocols
和Upgrade: websocket
表示本次连接的 HTTP 协议即将被更改(代码 101),改为指定的 WebSocket 协议。4 使用需知 & 实用指南
4.1 正确使用 ws 和 wss
ws
,如果在 TLS 协议上,标识符是wss
,类似于 https4.2 使用 Nginx 代理 WebSocket 请求
proxy_set_header Upgrade $http_upgrade
和proxy_set_header Connection "Upgrade"
, 配置后,当 Nginx 代理服务器拦截到客户端发来的 Upgrade 请求时,会使用 101(交换协议)返回响应,在客户端和代理服务器、后端服务器之间建立隧道来支持 WebSocket。4.3 如何解决 Nginx 掐断 WebSocket 连接的问题
4.3.1 问题简述
有时候会发现 WebSocket 连接莫名其妙断了,后端日志发现有如下报错:
4.3.2 原因
proxy_read_timeout
的默认值为 60s,表示等待服务器响应的时间。也就是说,当 WebSocket 使用 Nginx 转发时,如 60s 内没有通讯,Nginx 便会掐断连接。4.3.3 解决方案
proxy_read_timeout
设置为不超时onError
中调用reconnect
Other Resouces:
WebSocket 教程
面试官一脸邪乎的问:一个 TCP 连接能发多少个 HTTP 请求?