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

yk9xbfzb  于 2022-11-13  发布在  其他
关注(0)|答案(6)|浏览(167)

我目前正在尝试使用socket.io和node.js服务器与Unity脚本进行通信。我已经将所有内容连接起来并与localhost一起工作,但由于某种原因,当我将其移植到Heroku服务器时,它无法连接。我猜想这可能与URL有关?我是www.example.com的新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'));
});

我的联机URL:

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

jw5wzhpr1#

几乎可以肯定,问题是端口号不正确。
在您的应用程序中,您正在检查process.env.PORT,如果它设置,则默认为5000。
然而,在您的ws URL中,您似乎总是希望您的应用程序侦听端口5000。
通过在项目的根目录中运行以下命令,可以检查应用程序的配置设置:
heroku run printenv
这将打印一个配置变量列表,包括当前设置的PORT值,例如:
PORT=9352
您应该在构建ws URL时使用此端口,例如:

  • ws://www.example.comyour-app.herokuapp.com:9352/socket.io/?EIO=4&transport=websocket*
zbsbpyhn

zbsbpyhn2#

我找到了路!!
如果您在本地主机中运行服务器,则url应该包含“:端口”示例(端口= 5000)

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

但是如果已经部署到heroku**则必须删除该url“:端口”

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

这是我的工作!

6g8kf2rb

6g8kf2rb3#

我已经部署了您的代码与小的变化和它的工作正常的heroku请看看它。服务器端应用程序.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);
    });
});

软件包.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"
  }
}

索引.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>

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

hpcdzsge

hpcdzsge4#

好的,出于某种原因,我在这个问题线程上尝试了所有的方法,结果都成功了。但是不是一个单一的答案有效,而是每一个答案的组合。
首先,我删除了URL中的**:PORT**部分,有点像Chinnawat Sirima说的。现在...
www.example.comherokuapp.com/socket.io/?EIO=4&transport=websocket
然后,由于某种原因,用dangalg的answer/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都喜欢。因为localhost不在乎。
我只是重新编译这个,因为我已经在这个问题上沮丧了8个小时,或多或少。所以我希望这能帮助其他人,不要失去宝贵的时间和睡眠。
(btw,我的Heroku中没有PORT变量,我有一些其他的名字,我想这是另一个无用的行,但是我不再碰它了,以防我再次破坏它:D)。

s8vozzvw

s8vozzvw5#

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

r3i60tvu

r3i60tvu6#

我 做 了 一 个 噩梦 。 最 后 看 完 了 所有 的 文件 。
服务 器 : https://www.npmjs.com/package/socket.io 客户 端 :https://socket.io/docs/v4/client-initialization 格式
看 起来 我 的 结构 是 错误 的 。

    • 与 快速 服务 一起 提供 * *
const app = require('express')();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
io.on('connection', () => { /* … */ });
server.listen(3000);

中 的 每 一 个
我 的 完整 代码 。

const express = require('express')
const path = require('path');
const http = require('http')
const PORT = process.env.PORT || 5000
const app = express()
const server = http.createServer(app)
const cors = require("cors");

app.use(cors());

// Serve static files from the React app
app.use(express.static(path.join(__dirname, 'client/build')));

const io = require('socket.io')(server);
io.on("connection", (socket) => {

    
});

server.listen(PORT, () => console.log(`Server is running on port ${PORT}`));

格式
在 我 的 react 代码 中 , 我 只是 使用 。

const socket = io();

格式
希望 这 对 其他 人 有 帮助

相关问题