【问题标题】:Not able to connect to Websockets on Heroku无法连接到 Heroku 上的 Websocket
【发布时间】:2017-09-10 20:51:56
【问题描述】:

我一直在开发一个 PHP Laravel 应用程序,我一直在使用 Redis 和 Node.JS 来连接到 WebSocket。

所以为了实现这一点,我一直在尝试在端口 3000 上运行节点服务器,但 heroku 正在动态分配端口。

因此,我无法在客户端获取正确的端口号。

我应该怎么做才能修复它?

客户端配置:

var socket = io.connect('http://app-around.herokuapp.com:3000');
  Note: Host Name is app-around.herokuapp.com

后端运行良好,如下所示:

    C:\xampp\htdocs\around-us>heroku run node socket.jsRunning node 
   socket.js on app-around... up, run.5567 (Free)
    // Randomly generated port number it is..

   Message Recieved: {"event":"App\\Events\\NewMessage","data":{"data":
    {"message":"Question Posted"}},"socket":null}

因此,事件在服务器端生成,但无法在客户端接收。在前端尝试了几件事,但都没有工作:

    Eg: 1) var socket = io.connect();
        2) var socket = io.connect(window.location.hostname);

节点服务器代码:

      var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = require('redis').createClient(process.env.REDIS_URL);

redis.subscribe('test-channel', function(err, count) {

});

redis.on('message', function(channel, message) {
   console.log('Message Recieved: ' + message);

    message = JSON.parse(message);

    io.emit(channel + ':' + message.event, message.data);

     var temp = "data";
    io.emit("time", temp);

});

var port = process.env.PORT || 3000;

http.listen(port, function(){
    console.log('Listening on Port 23000');
});

前端 Angular 应用的 JS 代码:

var socket = io();

    socket.on("time",function(data){
            alert(data);
    });

【问题讨论】:

  • 在远程连接到 Heroku 时删除端口号 - 网络路由层会注意将 HTTP(端口 80)和 HTTPS(端口 443)转发到动态分配的端口。

标签: angularjs node.js heroku laravel-5 websocket


【解决方案1】:

在 Node 中,您应该从 env vars 中获取端口:

server.listen(+process.env.PORT || 3000, () => {
    Logger.info(`Listening on port ${process.env.PORT || 3000}...`);
});

并且在您的 io 客户端中您不需要指定端口号:

io.connect('http://app-around.herokuapp.com')

【讨论】:

  • @HoneyThakuria 你能分享你的socketIO服务器吗?
  • @HoneyThakuria 你在为http://app-around.herokuapp.com/socket.io/socket.io.js 的socketIO 客户端提供服务吗?
  • 我一直在使用
  • 尝试使用<script type="text/javascript" src="/socket.io/socket.io.js></script>。如果您可以共享您的节点服务器以及如何将套接字与 redis 一起使用,将会很有帮助。
【解决方案2】:

正如 Andrés 所说,服务器应该从环境中收集端口:

开发环境不会有PORT 变量,所以我们添加了一个默认端口(您使用的是3000,这很常见)。

  process.env.PORT || 3000

客户端 - 我假设是浏览器 - 应该能够使用 HTTP URL 地址自动识别目标服务器并连接到正确的 Websocket URL 和端口。

当我不使用预制库(库通常有自己的 URL 方案)时,我使用以下代码的变体:

// websocket connects to root ("/")
var ws_url =
    document.location.origin.replace(/^http/i, "ws");
// OR web socket connects to full URL path (i.e. "/my/path")
var ws_url =
    document.location.href.replace(/^http/i, "ws");

【讨论】:

    【解决方案3】:

    我猜问题出在您的客户端 var socket = io.connect('http://app-around.herokuapp.com'); 试试这个或 var socket=io.connect(); 希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2021-10-18
      • 2019-09-15
      • 2015-08-03
      • 2015-11-10
      • 2017-04-30
      • 2021-05-02
      相关资源
      最近更新 更多