谁发送http websocket升级请求?

时间:2014-10-16 10:19:09

标签: javascript websocket

的WebSocket?还是XMLHttpRequest?或者我必须自己做?

所以我理解客户端必须发送它,但是何时以及为什么?假设我使用XMLHttpRequest对象发送普通的HTTP GET。 我无法控制浏览器中内部tcp连接的持续时间,对吧? 如果我想使用websockets,我必须使用他们自己的websocket类,所以对于我作为用户,"升级"不可见,是吗? 只是浏览器正在做一些内部魔术来重用连接,整个升级过程对我来说与用户无关?我仍然需要使用两个不同的类,我恰好使用相同的端口,然后浏览器决定升级的性能原因。 这是真的正确吗?

1 个答案:

答案 0 :(得分:5)

不,WebSocket客户端发送请求WebSocket连接的HTTP请求,然后服务器响应HTTP 101交换协议,这意味着它接受连接,然后客户端可以开始以二进制格式发送和接收数据。

客户请求示例:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

服务器响应示例:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

维基百科文章中详细解释了这一点:http://en.wikipedia.org/wiki/WebSocket#WebSocket_protocol_handshake

详见规范:https://tools.ietf.org/html/rfc6455#section-1.3

  

只是浏览器正在做一些重用的内部魔术   连接,整个升级过程对我来说与用户无关?

这是对的。

  

我仍然要使用两个不同的类,我恰好使用了   相同的端口和浏览器然后决定性能原因   升级。这是真的正确吗?

如果您想使用AJAX,请使用XMLHttpRequest。如果要使用WebSocket,请使用WebSocket类。不过,它们可以通过同一个端口访问。不同之处在于WebSocket连接将与服务器协商全双工持久二进制通道,而XMLHttpRequest只会发出请求并获得响应。