【问题标题】:Socket.io + Azure web sockets issueSocket.io + Azure 网络套接字问题
【发布时间】:2016-03-30 02:16:30
【问题描述】:

我正在使用NodeJSsocket.IO 开发多人国际象棋游戏。

我在 Azure 上托管它时遇到了问题。我尝试了许多不同的方法,其中提到了一些:

通过添加以下代码强制应用程序仅使用 WebSocket:

io.configure(function() {
  io.set('transports', ['websocket']);
}); 

web.config 文件中添加了<webSocket enabled="false"/>..

注意:这会禁用 IIS WebSockets 模块,该模块包括它自己的 WebSockets 实现,并与 Node.js 特定的 WebSocket 模块(如 Socket.IO)发生冲突。如果此行不存在或设置为 true,这可能是 WebSocket 传输不适用于您的应用程序的原因。

匹配源协议以确保没有 SSL 问题。

io.configure(function() {
  io.set('match origin protocol', true);
});

我现在从头开始,因为我认为我的服务器端部分已损坏,并尝试了 Socket.io chat example

  • 我按照步骤操作。
  • 在 Azure 上创建了一个新的 Web 应用程序。
  • 通过 FileZilla FTP 发布了我的文件。
  • 在 Azure 上为我的应用启用 Web Sockets(默认禁用)。


还是一样的错误!见下图。

有人吗?我不确定这是客户端问题还是服务器端问题。似乎它正在尝试 XHR 轮询而不是使用网络套接字..

提前致谢。

【问题讨论】:

  • 这是 Azure Web 应用吗?另外,只是为了确认,这在本地有效吗?我有一个使用 Node 和 Socket.io 的快速部署按钮示例。里面的东西可能会有所帮助。 github.com/christopheranderson/node-chat-sample
  • Azure Web 应用程序,是的。这在本地有效(聊天示例和我的国际象棋游戏),忘记添加了。感谢您的样品,我会检查一下。
  • 我没有看到任何明显的错误表明您做错了,这意味着这可能是一件微妙的事情。试试我的示例,看看您是否看到类似的问题。由于您可能正在上传 node_modules 而不是使用 CI(节点版本 4.x.x 及更高版本存在本机模块支持),因此请确保您在本地和您的网络应用程序上具有匹配的节点版本。
  • 没有持续集成,只是手动上传。在我上传之前,我确保我通过执行npm init 生成了一个新的packages.json,所以它应该匹配..
  • 需要刷新的是node_modules。你可以使用npm update 来刷新你的包。 docs.npmjs.com/cli/update

标签: node.js azure socket.io azure-web-app-service


【解决方案1】:

我搞定了,谢谢Chris Anderson-MSFT 的帮助。

使用 FTP 部署时发生的奇怪事情是我的 node_modules 文件夹与我的 package.json 中指定的版本不同。

我通过将 Azure 上的 Web 应用程序连接到本地 Git 存储库并通过 git 部署应用程序来解决这个问题。这会递归地连接我的包并匹配正确的版本。

我还需要通过指定传输方法来强制我的客户端 socket-io 使用 Web 套接字:

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

这就是我的服务器端文件最终的样子:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 3000;
app.use(express.static('public'));

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

io.on('connection', function(socket) {
    io.set('transports', ['websocket']);
    console.log('new connection on socket.io');
    socket.on('move', function(msg) {
        socket.broadcast.emit('move', msg);
    });
});

server.listen(port, function () {
  console.log('Server listening at port %d', port);
});

【讨论】:

  • 在 FTP 期间您的问题是使用 Kudu 上的调试控制台删除您的 node_modules 文件夹并从 Kudu 运行 npm install,因此您总是可以尝试从根本上导致坏包。很高兴你修好了,@urbz!
  • 感谢@ChrisAnderson-MSFT 的精彩提示
猜你喜欢
  • 2011-03-06
  • 2019-02-15
  • 2013-03-18
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
相关资源
最近更新 更多