Socket.io适用于localhost但不适用于Heroku服务器

Car*_*son 5 sockets heroku node.js socket.io

我目前正在尝试使用socket.io和node.js服务器与Unity脚本进行通信.我把所有东西都连接起来并使用localhost,但由于某种原因,当我将它移植到我的Heroku服务器时它无法连接.我假设它可能与URL有关?我是socket.io的新手,所以任何帮助都将不胜感激.

我的node.js服务器:

var express = require('express');
var app = express();
var expressWs = require('express-ws')(app);
var path = require('path');

var server = require('http').createServer(app);
var io = require('socket.io')(server);

io.on('connection', function(socket) {
    socket.on('beep', function(){
        socket.emit("speed", {data: 5});
        console.log('beep recieved');
    });

    socket.on('change-speed', function(data) {
        console.log('change speed recieved: ' + data);
        socket.emit("speed", {newSpeed: data});
    });

    socket.on('ios-connection', function(data) {
        console.log('ios connection with message: ' + data);
    });

});

app.set('port', (process.env.PORT || 5000));

app.listen(app.get('port'), function() {
    console.log('Node app is running on port', app.get('port'));
});
Run Code Online (Sandbox Code Playgroud)

我的连接网址:

ws://<heroku app name>.herokuapp.com:5000/socket.io/?EIO=4&transport=websocket
Run Code Online (Sandbox Code Playgroud)

dun*_*all 5

问题几乎可以肯定是端口号不正确。

在您的应用程序中,您正在检查process.env.PORT,如果设置,则默认为5000。

但是,在ws URL中,您似乎总是希望应用程序在端口5000上进行侦听。

您可以通过在项目的根目录中运行以下命令来检查应用程序的配置设置:

heroku run printenv

这将打印一个配置变量列表,包括当前设置PORT值,例如:

PORT=9352

构造ws URL时,应使用此端口,例如:

ws://your-app.herokuapp.com:9352 / socket.io /?EIO = 4&transport = websocket

  • 我这样做了,每次执行printenv都会给我一个不同的端口。无论如何,我尝试了一下,但没有成功 (4认同)

小智 5

我找到了方法!! 在统一中

如果您在本地主机中运行服务器。url 应该有“:端口”示例(端口 = 5000)

ws://127.0.0.1:5000/socket.io/?EIO=4&transport=websocket
Run Code Online (Sandbox Code Playgroud)

但如果您已部署到 **heroku, 则 url 必须删除“:port”

ws://<heroku app name>.herokuapp.com/socket.io/?EIO=4&transport=websocket
Run Code Online (Sandbox Code Playgroud)

这对我有用!


小智 2

我已经部署了您的代码,并进行了一些细微的更改,并且它在 Heroku 上运行良好,请查看它。 服务器端app.js

var express = require('express');
var app = express();
app.set('port', (process.env.PORT || 5000));

var server = app.listen(app.get('port'), function() {
    console.log('Node app is running on port', app.get('port'));
});

var io = require('socket.io')(server);

app.use(express.static("./views"));

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});

app.get('/', function (req, res) {
    var path = __dirname + '/views/index.html';
    console.log(path);
    res.sendFile(path);
});

io.on('connection', function(socket) {
    socket.on('beep', function(){
        socket.emit("beep", {data: 5});
        console.log('beep recieved');
    });

    socket.on('change-speed', function(data) {
        console.log('change speed recieved: ' + data);
        socket.emit("speed", {newSpeed: data});
    });

    socket.on('ios-connection', function(data) {
        console.log('ios connection with message: ' + data);
    });
});
Run Code Online (Sandbox Code Playgroud)

包.json

{
  "name": "socketio",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start" : "node app.js"
  },
  "author": "inampaki",
  "license": "ISC",
  "dependencies": {
    "express": "^4.13.3",
    "express-ws": "^0.2.6",
    "socket.io": "^1.3.7"
  }
}
Run Code Online (Sandbox Code Playgroud)

索引.html

<script src="/socket.io.js"></script>
<script>
  var socket = io.connect('/');
  socket.on('speed', function (data) {
    console.log('speed Message Received!');
    console.log(data);    
  });

  socket.on('beep', function (data) {
    console.log('beep Message Received!');    
    console.log(data);    
  });
  socket.emit("beep", {beep : true});
  socket.emit("change-speed", {"change-speed" : true});
  socket.emit("ios-connection", {"ios-connection" : true});


</script>
Run Code Online (Sandbox Code Playgroud)

请注意,将index.html和socket.io.js保存在views文件夹中。我部署它的 URL 是socketip