Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Socket.io可与localhost一起使用,但不能在Heroku服务器上使用_Node.js_Sockets_Heroku_Socket.io - Fatal编程技术网

Node.js Socket.io可与localhost一起使用,但不能在Heroku服务器上使用

Node.js Socket.io可与localhost一起使用,但不能在Heroku服务器上使用,node.js,sockets,heroku,socket.io,Node.js,Sockets,Heroku,Socket.io,我目前正在尝试使用socket.io和node.js服务器与Unity脚本通信。我已经将所有东西连接起来并使用localhost,但由于某种原因,当我将它移植到Heroku服务器时,它无法连接。我想这可能和URL的地址有关吧?我是socket.io的新手,希望您能提供帮助 My node.js服务器: var express = require('express'); var app = express(); var expressWs = require('express-ws')(app);

我目前正在尝试使用socket.io和node.js服务器与Unity脚本通信。我已经将所有东西连接起来并使用localhost,但由于某种原因,当我将它移植到Heroku服务器时,它无法连接。我想这可能和URL的地址有关吧?我是socket.io的新手,希望您能提供帮助

My 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'));
});
我的连接URL:

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

我部署了您的代码,只做了一些小改动,在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>

var socket=io.connect('/');
socket.on('speed',函数(数据){
console.log('speed Message Received!');
控制台日志(数据);
});
socket.on('beep',函数(数据){
log('beep Message Received!');
控制台日志(数据);
});
emit(“beep”,{beep:true});
emit(“更改速度”,{“更改速度”:true});
emit(“ios连接”,{“ios连接”:true});
请注意,请在“视图”文件夹中保存index.html和socket.io.js。我部署它的URL是


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

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

然而,在您的ws-URL中,您似乎总是希望您的应用程序侦听端口5000

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

heroku运行printenv

这将打印配置变量的列表,包括当前设置的
端口
值,例如:

PORT=9352

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

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

我找到了路!!。 团结一致

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

但如果您已部署到**heroku url必须删除“:端口”

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

这是我的工作

好吧,出于某种原因,我尝试了所有关于这个问题的方法,结果都奏效了。然而,不是一个单一的答案有效,而是每一个答案的组合

首先,我删除了URL中的:PORT部分,有点像Chinnawat Sirima所说的。现在是

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

然后,出于某种原因,使用dangalg的答案/teyou的repo中的代码启动服务器确实有效(我还注意到teyou的url也没有端口)

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

我只是重新编译这个,因为在过去的8个小时里,我或多或少地对这个问题感到沮丧。所以我希望这能帮助其他人,不要浪费宝贵的时间和睡眠


(顺便说一句,我的Heroku中没有端口变量,我有其他名称,我想这是另一行无用的代码,但我不会再碰它了,以防我再次打断它:D)。

如果您已经将应用程序部署到Heroku,请按照给定从服务器URL中删除端口号,它应该可以正常工作。


ws://.herokuapp.com/socket.io/?EIO=4&transport=websocket
当您在本地测试应用程序时,可以通过
http://localhost:YOUR_PORT_NUMBER
在部署之后,您不需要指定端口。

代码正在工作(就像我以前的代码一样),但我仍然无法从Unity与该URL建立连接。你在Unity Boo或C中使用的是哪种语言?你能分享代码块吗?可能正在讨论这一方将解决问题。嗨,Caroline,你解决了这个问题吗?我面临一个类似的问题。我这样做了,每次我打印时,它都会给我一个不同的端口。不管怎样,我试过了,但没用。我应该把他的ws://your-app.herokapp.com:9352/socket.io/?EIO=4&transport=websocket放在程序文件的哪里?
ws://127.0.0.1:5000/socket.io/?EIO=4&transport=websocket
ws://<heroku app name>.herokuapp.com/socket.io/?EIO=4&transport=websocket
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);
});