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

NodesJS socketio-如何确保websockets被使用?

裴浩歌
2023-03-14

背景

  • 我正在将Unity应用程序连接到SocketIO应用程序
  • Unity正在使用SocketIO插件(仅使用websockets,不使用polling/xhr)

为了从Unity连接到我的websocket,我使用ws://localhost:3000/socket.io/?eio=4&transport=websocket。如果我通过浏览器点击该链接,我会看到以下内容:

{"code":3,"message":"Bad request"}

此时,我使用io.set('transports',['websocket'])为我的NodeJS应用程序强制使用websockets;,但随后我的应用程序停止工作。

问题

如何确保websockets可用于NodeJS+SocketIO?

代码

app.js

var app = require('express')();
var http = require('http').Server(app);

app.get('/', function(req, res){
        res.sendFile(__dirname + '/index.html');
});

var server = app.listen(3000, function () {
   var host = server.address().address
   var port = server.address().port
});
var io = require('socket.io').listen(server);
//io.set('transports', ['websocket']);

...

设置

  • Ubuntu@14.04
  • nodejs@0.10.25
  • Socketi@O1.7.3
  • express@4.15.2

共有1个答案

陶文林
2023-03-14

默认情况下,socket.io客户机从http轮询开始,然后在几次轮询事务之后切换到webSocket。据我所知,在服务器上所做的任何事情都不会改变客户机的行为方式,因此如果不支持服务器上的轮询,也不改变客户机的配置方式,那么初始的socket.io客户机连接将无法工作。但是,您可以在客户机和服务器中进行相应的更改,以强制Socket.io只使用webSocket,甚至从一开始就使用webSocket。如果查看网络跟踪,您仍然会看到初始的HTTP连接,因为所有webSocket连接都从HTTP连接开始,但随后该HTTP连接被“升级”为webSocket协议。

您可以在这里看到如何将客户端和服务器配置为仅使用webSocket的所有细节:socket.io1.x:仅使用WebSockets?。简而言之,为了建立连接,您需要在客户端中执行以下操作:

var socket = io({transports: ['websocket'], upgrade: false});
 类似资料:
  • 我使用AWS lambda作为后端来解析最近上传的文件,并维护一个json“peak”文件。我遇到的问题是,当用户上载多个文件时,同时调用lambda函数来维护峰值文件。因此,它在不等待前一个实例执行的情况下读取“peak”文件,结果是只有约1/3的文件被写入peak文件。 不幸的是,我不能批量上传到s3,也不能使用多部分上传,因为在应用程序的其余部分中,我需要每个单独的文件都在s3中自己的密钥下

  • 问题内容: 我有以下结构: 该方法 可以 被许多线程同时调用。该 会 抛出异常(它在后台,可能成为过时的使用一些数据)。 如果引发异常,则执行一些耗时的任务,比如说“更新”所有当前数据,并且我可以调用。 问题: 如何确保只调用 一次 ?如果我在的条目中放置了原子标志,则不能确定何时清除该标志。 我该如何解决?请注意:由于它是一个外部API,因此我无法修改,并且我正在使用装饰器模式来使用它。 问题答

  • 我从应用程序启动时的API调用中获取了一堆字符串。我把它们存储在一个字典里,变成一个单例,这样我就可以通过我的应用程序重用它们了。 问题是,在我的字典中初始化所有键之前,调用就完成了,完成就被激发了。什么方法会等待所有的初始化,这样它就不会返回nil了? 下面是我的初始化方法: completion(这里是success())正在触发,但是当我调用视图中的一个键时,它还没有初始化,所以我得到一个关

  • 确保函数只被调用一次。 使用一个闭包,使用一个成为 called 的标志,并在第一次调用该函数时将其设置为 true ,以防止它被再次调用。 为了允许函数改变它的 this 上下文(比如在一个事件监听器中),必须使用function 关键字,并且提供的函数必须应用上下文。 允许使用 rest(剩余)/spread(展开) (...) 运算符为函数提供任意数量的参数。 const once = fn

  • 我明白终结器是不好用的,即使用于连接关闭(是否在finalize最佳实践中关闭连接?),因为它们不能保证被调用。但是如果您的连接是通过连接池进行池化的呢?在我的例子中,我使用Apache Commons pool(http://Commons.Apache.org/proper/commons-pool/)来池化SFTP连接。我不能使用try-with-resources技术,因为每个连接不应该在