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