当尝试连接到localhost(使用终端)时,我得到了这个答案:
HTTP / 1.1 426升级要求
服务器:WebSocket ++ / 0.3.0-alpha4
如何回复升级?
答案 0 :(得分:5)
您显然是连接到WebSocket服务器,而不是普通的HTTP服务器
服务器: WebSocket ++ / 0.3.0-alpha4
WebSocket protocol以基于HTTP的请求/响应握手开始,客户端要求服务器将通信升级为全双工WebSocket消息传递。
426响应意味着初始握手未请求正确的WebSocket升级。每RFC 6455 Section 4.1 Client Requirements:
一旦建立了与服务器的连接(包括通过代理或通过TLS加密隧道的连接),客户端必须向服务器发送一个打开的握手。握手包括HTTP升级请求,以及必需和可选标头字段的列表。握手的要求如下:
握手必须是[RFC2616]指定的有效HTTP请求。
请求的方法必须是GET,HTTP版本必须至少为1.1。
例如,如果WebSocket URI为&#34; ws://example.com/chat" ;,则发送的第一行应为&#34; GET / chat HTTP / 1.1&#34;。< / p>
&#34; Request-URI&#34;请求的一部分必须匹配第3节中定义的/ resource name /(相对URI),或者是绝对的http / https URI,在解析时,它具有匹配的/ resource name /,/ host /和/ port /相应的ws / wss URI。
请求必须包含| Host |标题字段,其值包含/ host / plus可选&#34;:&#34;后跟/ port /(不使用默认端口时)。
请求必须包含| Upgrade |标题字段,其值必须包含&#34; websocket&#34;关键字。
请求必须包含| Connection |标题字段,其值必须包括&#34;升级&#34;令牌。
请求必须包含名称为| Sec-WebSocket-Key |的头字段。此标头字段的值必须是由随机选择的16字节值组成的随机数,该值已经过base64编码(参见[RFC4648]的第4节)。必须为每个连接随机选择随机数。
注意:例如,如果随机选择的值是字节序列0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10,则头字段的值将为&#34; AQIDBAUGBwgJCgsMDQ4PEC = =&#34;
请求必须包含名称为| Origin |的头字段[RFC6454]如果请求来自浏览器客户端。如果连接来自非浏览器客户端,则该请求可以包括此头字段,如果该客户端的语义与此处描述的浏览器客户端的用例匹配。此标头字段的值是上下文源的ASCII序列化,其中运行建立连接的代码。有关如何构造此标头字段值的详细信息,请参阅[RFC6454]。
例如,如果从www.example.com下载的代码尝试建立与ww2.example.com的连接,则标题字段的值将为&#34; http://www.example.com&#34;。
请求必须包含名称为| Sec-WebSocket-Version |的头字段。此标题字段的值必须为13。
注意:尽管发布了本文档的草稿版本(-09,-10,-11和-12)(它们主要包括编辑更改和说明,而不是对线路协议的更改),但值9,10 ,11和12未用作Sec-WebSocket-Version的有效值。这些值在IANA注册表中保留,但未使用和不会使用。
请求可以包含名称为| Sec-WebSocket-Protocol |的头字段。如果存在,则该值表示客户希望说出的一个或多个以逗号分隔的子协议,按优先顺序排序。包含此值的元素必须是非空字符串,其字符在U + 0021到U + 007E范围内,不包括[RFC2616]中定义的分隔符,并且必须都是唯一字符串。此标头字段值的ABNF是1#标记,其中构造和规则的定义如[RFC2616]中所述。
请求可以包含名称为| Sec-WebSocket-Extensions |的头字段。如果存在,则该值指示客户端希望发言的协议级扩展。第9.1节描述了此标题字段的解释和格式。
- 醇>
请求可以包含任何其他标头字段,例如,cookies [RFC6265]和/或与认证相关的标头字段,例如| Authorization |标题字段[RFC2616],根据定义它们的文档进行处理。
一旦发送了客户端的打开握手,客户端必须等待服务器的响应,然后再发送任何其他数据。
客户端必须按如下方式验证服务器的响应:
如果从服务器收到的状态代码不是101,则客户端会根据HTTP [RFC2616]过程处理响应。特别是,如果客户端收到401状态代码,则可能会执行身份验证;服务器可能使用3xx状态代码重定向客户端(但客户端不需要遵循它们)等。否则,请按以下步骤操作。
如果响应缺少|升级|标题字段或|升级| header字段包含的值不是对值&#34; websocket&#34;的ASCII不区分大小写的匹配,客户端必须使WebSocket连接失败。
如果响应缺少|连接|标题字段或|连接|标题字段不包含对值&#34;升级&#34;的ASCII不区分大小写的标记,客户端必须使WebSocket连接失败。
< / LI>如果响应缺少| Sec-WebSocket-Accept |标题字段或| Sec-WebSocket-Accept |包含除Sec-WebSocket-Key |的串联的base64编码的SHA-1之外的值(作为字符串,不是base64解码的)字符串&#34; 258EAFA5-E914-47DA-95CA-C5AB0DC85B11&#34;但忽略任何前导和尾随空格,客户端必须使WebSocket连接失败。
如果响应包含| Sec-WebSocket-Extensions |标题字段和此标题字段表示使用客户端握手中不存在的扩展名(服务器已指示客户端未请求的扩展名),客户端必须使WebSocket连接失败。 (解析此标头字段以确定请求哪些扩展名将在第9.1节中讨论。)
- 醇>
如果响应包含| Sec-WebSocket-Protocol |头字段和此头字段指示使用客户端握手中不存在的子协议(服务器已指示客户端未请求的子协议),客户端必须使WebSocket连接失败
如果服务器的响应不符合本节和4.2.2节中定义的服务器握手的要求,则客户端必须使WebSocket连接失败
请注意,根据[RFC2616],所有标题字段名称都在 HTTP请求和HTTP响应都不区分大小写。
如果服务器的响应按照上面的规定进行了验证,则说 WebSocket连接已建立并且WebSocket连接处于OPEN状态。