NodesJS SocketIO - 如何确保使用websockets?

时间:2017-03-28 14:44:50

标签: node.js websocket socket.io

背景

  • 我正在努力将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

2 个答案:

答案 0 :(得分:3)

您似乎同时使用WebSocket和Socket.io,它可能会导致冲突。你应该选择一个并坚持下去。如果您确定您的客户端将使用WebSocket,则根本不需要使用Socket.io。只需使用WebSocket广告,您就必须担心AJAX,彗星,长轮询的解决方法。

这是使用WebSocket的示例服务器端代码:

var path = require('path');
var app = require('express')();
var ws = require('express-ws')(app);
app.get('/', (req, res) => {
  console.error('express connection');
  res.sendFile(path.join(__dirname, 'ws.html'));
});
app.ws('/', (s, req) => {
  console.error('websocket connection');
  for (var t = 0; t < 3; t++)
    setTimeout(() => s.send('message from server', ()=>{}), 1000*t);
});
app.listen(3001, () => console.error('listening on http://localhost:3001/'));
console.error('websocket example');

正如您所看到的,这很简单。

请参阅这些答案中的代码示例以获取更多信息:

答案 1 :(得分:1)

默认情况下,socket.io客户端以http轮询开始,然后在几次轮询事务后切换到webSocket。我能够告诉你,在服务器上你无能为力将改变客户端的行为方式,所以如果你不支持在你的服务器上进行轮询而你不改变客户端的配置方式,那么初始socket.io客户端连接将无法正常工作。但是,您可以在BOTH客户端和服务器上进行相应的更改,以强制socket.io仅使用webSocket,即使从一开始。如果您正在查看网络跟踪,您仍将看到初始HTTP连接,因为所有webSocket连接都以HTTP连接开始,但随后该HTTP连接被“升级”为webSocket协议。

您可以在此处查看有关如何将客户端和服务器配置为仅使用webSocket的所有详细信息:Socket.io 1.x: use WebSockets only?。简而言之,您将希望在客户端中执行此操作以进行连接:

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