【问题标题】:Socket.io and node on OpenShiftOpenShift 上的 Socket.io 和节点
【发布时间】:2015-10-08 15:32:35
【问题描述】:

我读过 OpenShift 在服务器端的 8080 端口上监听。我还读到他们强制 Web 套接字连接到端口 8000 客户端。

我没有读到我需要提及端口 8000 服务器端,因为显然 OpenShifts apache reverseProxy 应该将 8000 路由到 8080(由应用程序决定它是什么类型的连接?)

我已经阅读了很多内容,尝试了所有内容,但我真的无法弄清楚这个问题。

在监听 8080 并与var socket = io(); 客户端连接时,站点在本地主机上运行良好。

在 OpenShift 上,请参阅以下内容:

客户端:8000,服务器:8080 运行并建立 WS 连接,但服务器没有响应。没有.on('connection', ... )。有道理,不听8000。

客户端:8000,服务器:8080,Server2:8000 尝试拥有 2 个单独的服务器并且站点无法构建(等待端口 8080 可用时超时)

客户端:8000,服务器:8000 网站无法建立(同上)

客户端:只需使用io() 连接服务器:8080 网站按预期运行,但回退到 xhr 长轮询

有人知道使用最新的 Socket.io、OpenShift 和 Express 4 的简单教程或示例吗?最糟糕的是,您看到的每个示例都以不同的方式(已弃用,比我所知道的更新?)方式启动他们的服务器。它对看似如此简单(甚至是广告)的东西感到疯狂。

仅供参考:最后一个端口组合,简单地连接 io(); 并在服务器端侦听端口 8080 早期工作得非常完美。 Websockets 在 OpenShift 上是不是喜怒无常?

【问题讨论】:

  • 由于您没有显示您的代码,我只能解决您的问题“等待端口 8080 可用时超时”。在 OpenShift 中,这意味着您正在尝试绑定到您无权使用的 IP 地址端口组合。换句话说,如果端口正确,您可能正在尝试绑定到 OpenShift 上不允许的 0.0.0.0 或 127.0.0.1。您只能绑定到 process.env.OPENSHIFT_NODEJS_IP。

标签: node.js express socket.io openshift


【解决方案1】:

正如马丁建议的那样:使用位于 https://developers.openshift.com/managing-your-applications/environment-variables.html 的 OpenShift 环境变量。您也可以通过这种方式获取端口。
但是,与 Martin 命名的变量不同,默认情况下我从“最新版本”墨盒中获得的代码是否包含 env.NODE_IP 和 env.NODE_PORT。如果您使用的是 0.10 节点盒式磁带,这可能会有所不同。

【讨论】:

    【解决方案2】:

    在与此作斗争后,我想我会使用 openshift 3、nodejs 6+、express 4 和 socket.io 1 分享我的设置。

    完整信息如下,但只是总结一些与我看到的其他来源建议的不同的要点:

    • 服务器使用8080端口和0.0.0.0的ip
    • 没有必要在客户端或服务器上将传输选项设置为“websocket”
    • 不需要在客户端指定端口号码
    • 对于远程客户端连接,确保不仅要调整套接字 url 的 ws/wss,还要在为 nodejsapp 创建安全路由时调整 openshift 上不同的路径

    对于服务器代码,我使用以下代码。请注意,一些较旧的文章似乎将 127.0.0.1 指示为端口,但实际上在 openshift 3 上似乎是 0.0.0.0

    var express = require('express');
    var app = express();
    
    var http = require('http').Server(app);
    var io = require('socket.io').listen(http);
    
    var port = process.env.PORT || process.env.OPENSHIFT_NODEJS_PORT || 8080;
    var ip_address = process.env.IP   || process.env.OPENSHIFT_NODEJS_IP || '0.0.0.0';
    
    http.listen(port, ip_address, function(){
      console.log( "Listening on " + ip_address + ", port " + port );
    });
    

    对于客户端代码,如果您尝试连接的页面是从 openshift 节点应用程序提供的,那么连接就很容易了..

    // works for http or https
    var socket = io.connect();
    

    如果您尝试从远程客户端进行连接,那么您只需要提供到您的应用程序的安全或不安全路由的路径并使用 ws/wss。 8000或8443端口就不用指定了!

    // http
    var socket = io.connect('ws://ROUTENAME-APPNAME.regionandstuff.openshiftapps.com');
    
    // https
    var socket = io.connect('wss://SECUREROUTENAME-APPNAME.regionandstuff.openshiftapps.com');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多