NodesJS SocketIO - 如何确保正在使用 websockets?

Jac*_*nkr 1 websocket node.js socket.io

背景

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

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

{"code":3,"message":"Bad request"}
Run Code Online (Sandbox Code Playgroud)

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

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

代码

应用程序.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']);

...
Run Code Online (Sandbox Code Playgroud)

设置

  • Ubuntu@14.04
  • NodeJS@0.10.25
  • SocketI@O1.7.3
  • 快递@4.15.2

jfr*_*d00 6

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

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

var socket = io({transports: ['websocket'], upgrade: false});
Run Code Online (Sandbox Code Playgroud)