当前位置: 首页 > 面试题库 >

Socket.io 1.x:仅使用WebSockets?

须巴英
2023-03-14
问题内容

我们正在开发一个Web应用程序,出于各种原因,该应用程序只能在现代浏览器(IE10 +)上运行。

我们实现的功能之一是Socket.io1.x。但是,默认情况下,Socket.io客户端会尝试支持较旧的浏览器,因此它将通过长时间轮询启动连接,然后将其更新为WebSockets。鉴于我们确定浏览器支持WS,因此这是浪费时间和资源。

最终,我找到了engine.io-client的文档(Socket.io-client基于1.x分支)。这是我编写的代码, 似乎
可以正常工作。但是,我想知道这是正确的还是做错了什么:

io.connect('https://...', {
    upgrade: false,
    transports: ['websocket']
})

奇怪的是,仅将transports属性设置为websockets仅具有一个数组是不够的。我也不得不禁用upgrade。它是否正确?

更新资料

我发现了一些新发现。

随着transports设置为['websocket']只,它没有任何阉差upgrade被启用。那是正常的吗?


问题答案:

socket.io发生两种“升级”。首先(在socket.io1.0+中),socket.io使用http轮询请求启动所有连接,实际上它可能仅通过http请求交换一些初始数据。然后,在那之后的某个时刻,它将尝试实际启动webSocket连接。通过发送指定upgrade: websocket报头的特定类型的http请求来完成webSocket连接,然后服务器可以适当地响应它是否支持websocket。如果服务器同意升级,则该特定的http连接将“升级”到webSocket协议。此时,客户端便知道支持webSocket,并且它停止使用轮询http请求,从而完成了upgrade对webSocket的请求。

您可以通过在客户端上执行以下操作完全阻止初始http轮询:

var socket = io({transports: ['websocket'], upgrade: false});

这将防止从您自己的合作客户端轮询连接。如果要阻止任何客户端使用轮询,则可以将其添加到服务器:

io.set('transports', ['websocket']);

但是,如果您在服务器上进行了设置,则最初与http轮询连接的socket.io客户端将根本无法工作。因此,这仅应与客户端中的正确设置相匹配,以使客户端从不开始轮询。

这将告诉两端您只想使用webSockets,而socket.io将在开始时跳过多余的http轮询。公平的警告,这样做需要webSocket支持,因此这排除了与尚不支持webSocket的IE的旧版本兼容。如果您想保持兼容性,那么只需让socket.io最初通过几个http请求就可以了。

这是有关从http升级到webSocket的协议的更多信息。

webSockets协议使用HTTP连接启动每个webSocket。这就是所有webSocket的工作方式。该HTTP连接上包含一些标头,这些标头表明浏览器将“希望”升级到webSockets协议。如果服务器支持该协议,则它会响应告诉客户端它将升级到webSocket协议,然后该套接字将从HTTP协议切换到webSocket协议。webSocket连接就是这样设计的。因此,您看到从HTTP连接开始的webSocket连接是100%正常的事实。

您可以将socket.io配置为从不使用长轮询,如果这样会使您感觉更好,但这不会改变webSocket连接仍将以HTTP连接开始,然后再升级为webSocket协议的事实,并且不会改善支持webSocket的现代浏览器中的操作效率。但是,它将这样做,以使您的连接在较旧的浏览器中无法正常工作。



 类似资料:
  • 我搜索了一下,只能找到这个关于socket.io0.9的wiki页面。 最终,我找到了engine.io-client的文档(socket.io-client基于1.x分支)。这是我写的代码,似乎正在工作。但是,我想知道这是正确的还是我做错了什么: 奇怪的是,仅仅将属性设置为仅具有的数组是不够的;我还必须禁用。这是正确的吗? 我有了一些新发现。 当仅设置为时,是否启用并没有什么区别。这正常吗?

  • 以下是仅限于 OS X 系统的技巧。 用 brew (Homebrew)或者 port (MacPorts)进行包管理。这些可以用来在 OS X 系统上安装以上的大多数命令。 用 pbcopy 复制任何命令的输出到桌面应用,用 pbpaste 粘贴输入。 若要在 OS X 终端中将 Option 键视为 alt 键(例如在上面介绍的 alt-b、alt-f 等命令中用到),打开 偏好设置 -> 描

  • 问题内容: 几年前我有这个面试问题,但是我还没有找到答案。 做无限循环的x和y应该是什么? 我们试着用,, VS 。 问题答案: 您需要两个可比较,具有相同值但代表不同实例的变量,例如: 和都为true,因为取消了装箱,但是实例相等性为false。 请注意,它也可以与一起使用,并且任何值(不仅是0)都可以使用。 您还可以使用JVM的复杂性-它们通常仅缓存最多127个整数,因此也可以使用: (但是1

  • 服务器端(app.js) var app = require('express').createServer(); var io = require('socket.io')(app); app.listen(80); app.get('/', function (req, res) { res.sendFile(__dirname + '/index.html'); }); io.on

  • 我有在android版本4.4.3中工作的代码,但在4.4.2中不行,我需要它在使用4.4.2时重定向到某个页面,但我似乎无法找到只针对特定版本号重定向的方法。下面的代码在设备使用KitKat时重定向,但我需要对它进行编辑,以便不使用Version_Codes.KitKat.,它将是类似Version_Codes的东西。这可能吗?如果是,正确的语法是什么。 事先谢谢你的帮助

  • 我试图找到用pdfbox版本2签署pdf的例子。x、 在bouncycastle中,我看到的只是pdfbox版本1.8.9 https://github.com/mkl-public/testarea-pdfbox1/blob/master/src/main/java/mkl/testarea/pdfbox1/sign/CreateSignature.java 这适用于pdfbox 1.8.9,但