WebSocket 常见问题

4,294 阅读3分钟

1、WebSocket 和 http 有什么区别?

  • webscoket 是双向通信协议,模拟 Scoket 协议,可以双向发送或接收消息。而 HTTP 是单向的。
  • Websocket 是需要浏览器和服务器握手建立连接的,而 HTTP 是浏览器向服务器发送请求,服务器预先不知道这个连接。
  • Webscoket 没有同源限制,客户端可与任何服务器通信。

2、WebSocket 和 scoket 有什么区别?

Scoket 是传输控制层接口,它是在程序层面上对传输层协议(可以主要理解为 TCP/IP)的接口封装。 我们知道传输层的协议,是解决数据在网络中传输的,那么 socket 就是传输通道两端的接口。所以对于前端而言,socket 也可以简单的理解为对 TCP/IP的抽象协议。

Webscoket 是应用层协议,它是包装成了一个应用层协议作为 socket,从而能够让客户端和远程服务端通过 web 建立全双工通信。websocket 提供 ws 和 wss 两种URL方案。

3、http 和 WebSocket 能共用一个端口吗,为什么?

websocket是http的升级版(upgrade),我们只需要定制http服务器的upgrade函数即可。让upgrade函数充当websocket的路由器(多个websocket共用同一端口可以通过路由器来转发)。

4、WebSocket 如何做心跳检测、数据加密、身份验证?

5、WebSocket 握手阶段是通过什么协议传输的?握手成功后会返回一个什么状态?200吗?

ws 握手阶段采用的是http协议。
readyState 属性返回实例对象的当前状态,共有四种:

  • CONNECTING:值为 0,表示正在连接。
  • OPEN:值为 1,表示连接成功,可以通信了。
  • CLOSING:值为 2,表示连接正在关闭。
  • CLOSED:值为 3,表示连接已经关闭,或者打开连接失败。

返回的的状态码为 101,详见:developer.mozilla.org/zh-CN/docs/…

6、WebSocket 可以携带 cookie 吗,为什么?如果可以,怎么做到?

websocket 是TCP/IP层的链接,而cookie是应用层HTTP协议的东西,因此不能。
除非 websocket 在浏览器不支持的情况下用的降级方案。且建立了 socket 连接,只要不断开,双方就可以互发数据。想要 cookie 只要服务端告诉客户端,我需要 cookie,客户端 send 一下 document.cookie,服务器就收到了。
cookie 和 session 是为了解决http这种无状态的协议而产生的。socket 一直保持连接,不需要 cookie 这种东西。换个思路,cookie 只能保存64K的内容。而 HTML5 本地存储可以保存1M-5M的内容。如果服务器需要,也可以通过 socket 把本地存储的内容发送到服务器,发挥更多作用。

7、WebSocket 如何区分不同客户端?

两种方案:一种是通过在Server取HttpSession中的值获取当前用户,一种是直接在客户端建立连接时附带上用户的值。
参考:blog.csdn.net/qq_33171970…

8、WebSocket 和 http2 有什么区别?http2 能取代 WebSocket 吗?为什么

http2 不能取代 WebSocket,原因很简单:正如我们上面所见,HTTP / 2引入了服务器推送,使服务器能够主动将资源发送到客户端缓存。但是,它不允许将数据推送到客户端应用程序本身。服务器推送仅由浏览器处理,不会弹出到应用程序代码,这意味着应用程序没有API来获取这些事件的通知。
参考:cloud.tencent.com/developer/a…