Websocket?或者XMLHttpRequest?或者我必须自己做?
所以我理解客户必须发送,但何时发送以及为什么发送?假设我使用XMLHttpRequest对象发送一个普通的HTTPGET。我无法控制浏览器中的内部tcp连接持续多久,对吧?如果我想使用websocket,我必须使用它们自己的websocket类,所以对我这个用户来说,"升级"是不可见的,是吗?只是浏览器在做一些内部魔法来重用连接,整个升级过程对我这个用户来说无关紧要?我仍然需要使用两个不同的类,我只是碰巧使用了同一个端口,然后浏览器出于性能原因决定升级。这真的正确吗?
否,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://www.rfc-editor.org/rfc/rfc6455#section-1.3
只是浏览器在做一些内部魔术来重用连接,整个升级过程对我这个用户来说是无关紧要的?
没错。
我仍然需要使用两个不同的类,我只是碰巧使用然后浏览器出于性能原因决定升级这真的正确吗?
如果你想使用AJAX,你可以使用XMLHttpRequest
。如果您想使用WebSocket,您可以使用WebSocket
类。不同的是,WebSocket连接将与服务器协商一个全双工持久二进制通道,而XMLHttpRequest
只会发出请求并得到响应。