如何使用 javascript 在浏览器中找出 websocket-protocol 版本?

Posted

技术标签:

【中文标题】如何使用 javascript 在浏览器中找出 websocket-protocol 版本?【英文标题】:How can I find out the websocket-protocol version in a Browser using javascript? 【发布时间】:2013-03-21 15:38:19 【问题描述】:

只有当 websocket-version 为 13 又名 RFC 6455 可用时,我才想将 websockets 与 Jetty-Server(版本 8.1.9)一起使用。如果它不可用,将使用 http-fallback-solution。

[random Browser javascript]  <--websocket v13 only--> [Jetty Server Java]

websocket-protocol-version 存储在 WebSocket 握手请求中:

GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com

现在我想在 javascript 中有这样的东西:

if (window.WebSocket)

    // browser supports websockets
    if (bla.websocketversion != 13)
    
        // wrong websocket version
        // use fallback connection
    
    else
    
        // use websockets
    

else

    // use fallback connection

如果我使用带有 Safari 5.0.2 的 iPad(它似乎使用较旧的 websocket 协议)连接到 Jetty-Server,我会收到警告: 警告:oejw.WebSocketFactory:不支持的 Websocket 版本:2147483647

我找不到在 Javascript 中获取访问权限或更改握手请求的方法。不可能吗?有什么解决方法吗?

【问题讨论】:

如果当前版本是132147483647 似乎相当先进 :-) 【参考方案1】:

这可能是一个建议,到目前为止,我们无法从 websocket 对象中获取任何属性。所以我们可以在特定的时间内测试一个 websocket 连接。这可能是一种临时解决方法。

此解决方法仅在连接未建立,websocket 就绪状态仍在连接时

function init()


  _ws = new WebSocket("ws://example.com");

  _ws.onopen = onopen();

  _ws.onclose = onclose();

   setTimeout(function () connectionCheck(_ws), 5000);




function connectionCheck(_ws)



   if(_ws.readyState == 0)
   
      //call your fallback sollution
   
   else
   
      return;
   

【讨论】:

以上是关于如何使用 javascript 在浏览器中找出 websocket-protocol 版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何找出按下的字符键?

如何使用 JavaScript 防止浏览器对退格按钮的默认历史返回操作?

如何找出使用 javascript/jquery 调用函数的次数?

如何在Javascript中找出从某个文件调用的函数

我们如何使用 javascript 找出 webview.MediaPlaybackRequiresUserAction 的值

如何找出用户在 Javascript 中选择了哪个单选按钮?