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

时间:2015-12-28 18:33:53

标签: node.js sockets heroku 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'));
});

我的连接网址:

ws://<heroku app name>.herokuapp.com:5000/socket.io/?EIO=4&transport=websocket

6 个答案:

答案 0 :(得分:4)

问题几乎肯定是错误的端口号。

在您的应用程序中,您正在检查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和;运输= WebSocket的

答案 1 :(得分:2)

我找到了方法!! 在Unity中

如果您在localhost中运行服务器。网址应该有“:port” 示例(port = 5000)

ws://127.0.0.1:5000/socket.io/?EIO=4&transport=websocket

但如果您已部署到** heroku 网址必须删除“:port”

ws://<heroku app name>.herokuapp.com/socket.io/?EIO=4&transport=websocket

这对我有用!

答案 2 :(得分:1)

我已经部署了您的代码并进行了微小的更改,并且在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);
    });
});

<强>的package.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"
  }
}

<强>的index.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>
  

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

答案 3 :(得分:1)

让我告诉你我做了什么作为解决方案。 我使用了这个项目:https://github.com/teyou/Unity_POC_Socket与Heroku一起使用 并将套接字io代码更改为我的代码,它的工作原理...... 所以你可以这样做或检查是什么让这个项目有效。

答案 4 :(得分:0)

好吧,由于某种原因,我在此问题线程上尝试了所有方法,并成功了。但是,并非只有一个答案有效,而是每个答案都有效。

首先,我删除了URL中的:PORT 部分,就像Chinnawat Sirima所说的那样。现在...

  

ws://.herokuapp.com/socket.io/?EIO = 4&transport = websocket

然后,出于某种原因,使用dangalg的答案/ teyou的repo中的这段代码启动服务器就可以了(我也注意到teyou的url也没有端口)。

var express = require('express');
var app = express();
var http = require('http').createServer(app);
var io = require('socket.io')(http);
var PORT = process.env.PORT || 3000;

(more code here)

http.listen(PORT,function(){
    console.log("Listening to port " + PORT);
});

为什么我说“出于某种原因”?因为我仍然不知道我做了什么。我的猜测是,我以Heroku不喜欢的方式设置服务器,但是每天localhost都会这样做。因为本地主机不在乎。

我正在重新编译此代码,因为过去8个小时(或多或少)我一直对这个问题感到沮丧。因此,我希望这可以帮助其他人,避免浪费宝贵的时间和睡眠。

(顺便说一句,我在Heroku中没有PORT变量,我还有其他名称,我想那是另一条没用的行,但是如果我再次破坏它,我就不再使用它了:D)。

答案 5 :(得分:0)

如果您已将应用程序部署到Heroku,请从给定的服务器URL中删除端口号,它应该可以正常工作。 ws://<heroku app name>.herokuapp.com/socket.io/?EIO=4&transport=websocket 在本地测试应用程序时,可以通过 http://localhost:YOUR_PORT_NUMBER 访问套接字,在部署后,您无需指定端口。