OpenShift / NodeJS 中的 WebSocket 失败

3

我知道这里已经有相似的问题被问过了,但是没有一个提出的解决方案能够解决问题。(我将在下面发布相关的答案)

我无法让一个简单的websocket应用程序在openshift上工作。该应用程序在本地可以工作。 [编辑:我正在使用socket.io]

相关代码:

服务器端:

var express = require('express');
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io').listen(server);

server.listen(process.env.OPENSHIFT_NODEJS_PORT, process.env.OPENSHIFT_NODEJS_IP);  

io.on('connection', function (socket) {
… 
});

index.html

<script src="/socket.io/socket.io.js"></script>

Client.js

this.socket = io.connect('http://app-domain.rhcloud.com:8000', {'forceNew':true });

结果:

  • GET http://****-****.rhcloud.com:8000/socket.io/?EIO=2&transport=polling&t=1446734825100-0 net::ERR_CONNECTION_TIMED_OUT *

我尝试过的方法

在客户端上使用80端口而不是8000端口

结果:WebSocket连接到'ws://app-domain.rhcloud.com/socket.io/?EIO=2&transport=websocket&sid=rsqAz33O_aYSFfN3AAAD'失败:WebSocket握手期间出错:意外的响应代码:400

交换server.list(…var io = require('…

没有结果

使用服务器的IP地址而不是http://app-domain.rhcloud.com

没有结果

类似的问题

以下问题都涉及相同的问题,但迄今为止没有一个提出的解决方案起作用。

Socket.io和OpenShift上的Node

OpenShift NodeJS部署:socket.io index.html端口分配等

无法在OpenShift上部署nodejs socket io应用程序

无法使用OpenShift运行socket.io和nodejs

Socket.io.js在OpenShift上返回404

我还克隆了一些socket.io / openshift的github示例,但它们都涉及相同的问题。

要么我做错了什么,要么在openshift上出了点问题。

提前致谢。


2
你尝试过在客户端中强制使用 WebSocket 传输吗?this.socket = io('...', {forceNew: true, transports: ['websocket']}); - Xodrow
你尝试过在连接时运行 rhc tail <yourappname> 来检查 OpenShift 日志吗?它可能会提供更多关于问题所在的线索。 - Jiri Fiala
@Jiri:是的,当然……但是没有语法错误,所以日志记录并不多。所以那里没有帮助! - Subtiv
@Xodrow 我试过了... 没有显著的变化。 - Subtiv
似乎@Xodrow是正确的。 - Roy Sharon
显示剩余2条评论
2个回答

1

我终于解决了。显然,在服务器端硬编码传输配置可以使其正常工作。

var io = require('socket.io', {
        transports: ['websocket']
    })(http);

希望这能在未来帮助到某个人。

(保留HTML标签)

0
我在使用OpenShift上的socket.io制作简单聊天应用时遇到了同样的问题。我在Stack Overflow上查看了很多评论,最终我改变了两个地方。
首先,添加以下内容:
 app.use(function(req,res,next)
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "X-Requested-With");
        res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
        next();})

其次,在需要 socket.io 模块时添加一个选项。
  var io = require('socket.io', {
      transports: ['websocket']
  })(http);

我不知道为什么和哪个更改起作用了。感谢任何建议和指导。 - gwl002

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接