A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qinchog 中级黑马   /  2013-7-4 17:11  /  1161 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

要_建立WebSocket连接_,客户端打开一个连接并发送一个握手,就像本节中定义那样。一个连接最初被定义为一个CONNECTING状态。客户端将需要提供一个/host/、/port/、/resource name/、和/secure/标记,它们都是在第三章讨论的WebSocket URI的组件,连同一起使用的一个/protocols/和/extensions/列表。此外,如果客户端是一个web浏览器,它提供/origin/。客户端运行在一个受控环境,例如绑定到特定运营商的手机上的浏览器,可以下移(offload)连接管理到网络上的另一个代理。在这种情况下,用于本规范目的的客户端被认为包括手机软件和任何这样的代理。

当客户端要_建立一个WebSocket连接_,给定一组(/host/、/port/、/resource name/、和/secure/标记)、连同一起使用的一个/protocols/和/extensions/列表、和在web浏览器情况下的一个/origin/,它必须打开一个连接、发送一个打开阶段握手、并读取服务器响应中的握手。应如何打开连接的确切要求、在打开阶段握手应发送什么、以及应如何解释服务器响应,在本节如下所述。在下面的文本中,我们将使用第三章的术语,如定义在那章的“/host” 、和“/sucure/标记” 。

  • 传入该算法的WebSocket URI组件(/host/、/port/、/resource name/、和/secure/ 标记) 根据指定在第3章的WebSocket URI规范,必须是有效的。如果任何组件是无效的,客户端必须_失败WebSocket连接_并终止这些步骤。
  • 如果客户端已经有一个到通过主机/host/和端口/port/对标识的远程主机(IP地址)的WebSocket连接,即使远程主机是已知的另一个名字,客户端必须等待直到连接已建立或由于连接已失败。必须不超过一个连接处于CONNECTING 状态。如果同时多个连接到同一个IP地址,客户端必须 序列化它们,以致一次不多于一个连接在以下步骤中运行。
    如果客户端不能决定远程主机的IP地址(例如,因为所有通信是通过代理服务器本身进行DNS查询),那么客户端必须假定这步的目的是每一个主机名引用一个不同远程主机,且相反,客户端应该限制同时挂起的连接总数为一个适当低的数(例如,客户端可能允许到a.example.com和b.example.com同时挂起连接,但如果30个同时连接到同一个请求的主机,那可能是不允许的)。例如,在一个web浏览器上下文中,客户端需要考虑用户已经打开的标签数量,在设置同时挂起的连接数量的限制时。
    注意:这使得它很难仅通过打开大量的WebSocket连接到远程主机为脚本执行一个拒绝服务攻击。当攻击在关闭连接之前被暂停时,服务器可以进一步降低自身的负载,因为这将降低客户端重新连接的速度。
    注意:没有限制一个客户端可以与单个远程主机有的已建立的WebSocket连接数量。服务器可以拒绝接受来自具有大量的现有连接的主机/IP地址的连接或当遭受高负载时断开占用资源的连接。
  • 使用代理:当有WebSocket协议连接主机/host/和端口/port/时,如果客户端配置使用代理,那么客户端应该连接到代理并要求它打开一个到由/host/给定主机和/port/给定端口的TCP连接。 例子:例如,如果客户端为所有信息传输使用一个HTTP代理,那么如果它试图连接到服务器example.com的80端口,它可能会发送以下行到代理服务器:

    Java代码  

    • <code style="font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; margin: 0px; padding: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;">       Sec-WebSocket-Accept     = base64-value-non-empty  
    •        base64-value-non-empty = (1*base64-data [ base64-padding ]) |  
    •                                 base64-padding  
    •        base64-data      = 4base64-character  
    •        base64-padding   = (2base64-character "==") |  
    •                           (3base64-character "=")  
    •        base64-character = ALPHA | DIGIT | "+" | "/"</code>  

      
    如果还有密码,连接可能看起来像:

    Java代码  

    • <code style="font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; margin: 0px; padding: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;">CONNECT example.com:80 HTTP/1.1  
    • Host: example.com  
    • Proxy-authorization: Basic ZWRuYW1vZGU6bm9jYXBlcyE=</code>  

      
    如果客户端没有配置使用一个代理,那么应该打开一个直接TCP连接到由/host/给定的主机和/port/给定的端口。


评分

参与人数 1技术分 +1 收起 理由
张勇1993 + 1 神马都是浮云

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马