You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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 请求?
The text was updated successfully, but these errors were encountered: