当前位置: 首页 > 知识库问答 >
问题:

socket.io1.x:只使用WebSockets?

卫飞鹏
2023-03-14

我搜索了一下,只能找到这个关于socket.io0.9的wiki页面。

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

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

奇怪的是,仅仅将transports属性设置为仅具有WebSockets的数组是不够的;我还必须禁用upgrade。这是正确的吗?

我有了一些新发现。

transports仅设置为['websocket']时,是否启用Upgrade并没有什么区别。这正常吗?

共有1个答案

厍光霁
2023-03-14

socket.io有两种类型的“升级”。首先(在socket.io 1.0+中),socket.io使用http轮询请求启动所有连接,它实际上可能只使用http请求交换一些初始数据。然后,在这之后的某个时候,它将尝试实际初始化webSocket连接。webSocket连接是通过发送指定Upgrade:webSocket标头的特定类型的http请求完成的,然后无论服务器是否支持webSocket都可以做出相应的响应。如果服务器同意升级,那么特定的http连接将“升级”到webSocket协议。此时,客户机知道webSocket是受支持的,并停止使用轮询http请求,从而完成其升级到webSocket。

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

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

这将阻止轮询来自您自己的协作客户端的连接。如果您希望防止任何客户端使用轮询,那么您可以将以下内容添加到服务器:

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

下面是从http到WebSocket协议升级的更多信息。

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

您可以将socket.io配置为永远不使用长轮询,如果这样会让您感觉更好的话,但这不会改变以下事实:webSocket连接仍然从HTTP连接开始,然后升级到webSocket协议,也不会提高支持webSocket的现代浏览器中的操作效率。然而,它将使您的连接在旧的浏览器中无法工作。

 类似资料:
  • 问题内容: 几年前我有这个面试问题,但是我还没有找到答案。 做无限循环的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

  • 问题内容: 我们正在开发一个Web应用程序,出于各种原因,该应用程序只能在现代浏览器(IE10 +)上运行。 我们实现的功能之一是Socket.io1.x。但是,默认情况下,Socket.io客户端会尝试支持较旧的浏览器,因此它将通过长时间轮询启动连接,然后将其更新为WebSockets。鉴于我们确定浏览器支持WS,因此这是浪费时间和资源。 最终,我找到了engine.io-client的文档(S

  • 我试图找到用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,但

  • 在Spark2.1文档中提到 如何解释这些(冲突?)一些信息?

  • 我现在的目标是创建一个网格,这将是我的游戏的基础。当玩家从菜单开始游戏时,这个网格应该出现在游戏场景上。稍后,我希望能够根据用户输入更改电路板的大小 1.在eventhandler中创建网格 我的推理是当玩家点击启动游戏的“SinglePlayer”按钮时创建网格。根据这个推理,我将简单地获取根节点(一个组)的子节点,并将gridpane添加到其中 为什么我被困住了 下面的代码段显示处理on bu