2014-10-16 138 views
1

Websocket?还是XMLHttpRequest?或者我必须自己做?谁在发送http websocket升级请求?

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

回答

2

不,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只会提出请求并获得响应。

+0

哦好吧,所以每个WebSocket类如果想要发送二进制数据就发送一个Http请求。所以假设我发送一个http get,然后打开一个websocket,然后发送一个普通的http get ...然后浏览器必须打开一个新的客户端套接字,因为旧的已经转换为websocket,并且我认为它保持这种方式永远现在,并且该套接字上的服务器端不需要能够处理http请求? – Blub 2014-10-16 12:07:51

+0

对。每个WS连接始终作为HTTP请求启动。一旦WS协商通过HTTP完成,连接就不会关闭,它会一直保持开放状态,使用二进制框架进行消息传递,直到它关闭,在该通道中不再允许HTTP。这种HTTP协商机制非常有用,因为它允许遍历安全检查器,并且不需要在路由器和防火墙中映射和/或打开其他TCP端口;它也允许交换cookie,所以它很好地集成到了网络应用程序中。 – vtortola 2014-10-16 12:12:07