谁在发送http websocket升级请求?
Websocket?还是XMLHttpRequest?或者我必须自己做?谁在发送http websocket升级请求?
所以我明白客户端必须发送它,但是何时以及为什么?假设我使用XMLHttpRequest对象来发送一个正常的HTTP GET。 我无法控制浏览器内部tcp连接持续的时间,对吗? 如果我想使用websockets,我必须使用自己的websocket类,所以对于我作为用户来说,“升级”是不可见的,是吗? 这只是浏览器正在做一些内部魔术来重用连接,整个升级过程对我来说是不相关的用户?我仍然需要使用两个不同的类,我只是碰巧使用同一个端口,然后浏览器决定升级性能的原因。 这真的是对的吗?
不,WebSocket客户端发送HTTP请求请求WebSocket连接,然后服务器以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://en.wikipedia.org/wiki/WebSocket#WebSocket_protocol_handshake
,它是在该规范中详述:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
据维基百科文章中很好地解释https://tools.ietf.org/html/rfc6455#section-1.3
这只是浏览器正在做一些内部魔术来重用连接,整个升级过程对我来说是不相关的用户?
这是正确的。
我还是要使用两个不同的类,我只是碰巧使用了 相同的端口,然后在浏览器决定出于性能的考虑到 升级。这真的是对的吗?
如果您想使用AJAX,请使用XMLHttpRequest
。如果你想使用WebSocket,你可以使用WebSocket
类。不过,它们可以通过同一个端口访问。不同之处在于WebSocket连接将与服务器协商一个全双工持久二进制通道,而XMLHttpRequest
只会提出请求并获得响应。
哦好吧,所以每个WebSocket类如果想要发送二进制数据就发送一个Http请求。所以假设我发送一个http get,然后打开一个websocket,然后发送一个普通的http get ...然后浏览器必须打开一个新的客户端套接字,因为旧的已经转换为websocket,并且我认为它保持这种方式永远现在,并且该套接字上的服务器端不需要能够处理http请求? – Blub 2014-10-16 12:07:51
对。每个WS连接始终作为HTTP请求启动。一旦WS协商通过HTTP完成,连接就不会关闭,它会一直保持开放状态,使用二进制框架进行消息传递,直到它关闭,在该通道中不再允许HTTP。这种HTTP协商机制非常有用,因为它允许遍历安全检查器,并且不需要在路由器和防火墙中映射和/或打开其他TCP端口;它也允许交换cookie,所以它很好地集成到了网络应用程序中。 – vtortola 2014-10-16 12:12:07