【问题标题】:simple TCP socket chat server doesn't work on heroku简单的 TCP 套接字聊天服务器在 heroku 上不起作用
【发布时间】:2013-02-21 00:10:52
【问题描述】:

我想在 heroku 上构建一个 node.js 聊天服务器,聊天客户端将是 iOS 应用程序。

我的第一次尝试是基于socket.io构建一个服务器。它可以工作,但我不喜欢 iOS 应用程序使用长轮询而不是 websocket 或 tcp 套接字与服务器通信的事实。

所以我的第二次尝试是使用真正的 TCP 套接字构建服务器,代码如下:

var net = require('net');

var sockets = [];

var server = net.createServer(function(socket){
    sockets.push(socket);
    socket.on('data', function (data) {
        for(var i=0; i< sockets.length; i++)
        {
            sockets[i].write(data);
        }
    });
    socket.on('end', function() {
        var i  = sockets.indexOf(socket);
        sockets.splice(i, 1);
    })
});

var port  = process.env.PORT || 5000;
console.log("server listening to port " + port);
server.listen(port);

如果我在 localhost 中部署这个 node.js 服务器代码,我可以使用终端作为测试客户端成功地向 TCP 服务器发送和接收聊天

nc localhost 5000

但是,如果我在 heroku 中部署此服务器代码,我将无法再与服务器建立 tcp 连接。

我的理解是服务器将监听 process.env.PORT。

所以我首先追踪了服务器正在侦听的这个端口,例如30134.

如果我尝试以这种方式连接:

nc http://my-heroku-app.herokuapp.com 30134

什么都没有发生。

我认为我在某个地方存在一些根本性的误解。谁能指导我?在 Heroku 服务器上可以进行 Real TCP 套接字聊天吗?

【问题讨论】:

  • Procfile的内容是什么?

标签: node.js heroku


【解决方案1】:

Heroku 不支持 websocket。这就是为什么,例如,socket.io 需要被强制使用xhr-polling。 (见https://devcenter.heroku.com/articles/using-socket-io-with-node-js-on-heroku)。

您可以使用支持多种传输的socket.io 之类的东西,而不是直接使用套接字。

这是因为他们使用旧版本的nginx,它没有完整的网络套接字支持。

另外,您的应用正在侦听的端口e.g. 30134 由 nginx 从端口 80 上的 heroku 主机名代理到 heroku 内部网络上的应用端口。

【讨论】:

  • 好吧,HTTP 是 TCP。我想唯一不方便的是 nginx 会在某个时候使请求超时。如果你真的需要 TCP,你可以通过给 nginx 一个 CONNECT 方法来绕过它。
  • 嗨,帕斯卡,我知道 Heroku 不支持真正的 Web 套接字。正如我的问题中提到的,我之前尝试过 socket.io,它可以工作,但我不喜欢长轮询与 TCP 套接字服务器相比可能会慢的事实?不是 websocket,而是原始 TCP 套接字?
  • nginx 只面向 http,足以支持一些 http/1.1,但不足以支持普通的 tcp。特别是在它是无国籍的意义上。最近添加对 websocket 支持的更新是一个加分项,但仍不足以支持普通的 tcp 连接。所以你应该使用可以通过heroku的前端(nginx)的东西。
  • 嗨,帕斯卡,感谢 heroku 不支持纯 tcp 连接的提示。如果我需要设置一个支持纯 tcp 连接的服务器,你有什么建议吗?亚马逊?
  • EC2 是更好的选择,虽然他们的负载均衡器可能存在一些问题,但您可以进行普通的 tcp 连接(例如 ssh)。
【解决方案2】:

我知道我参加这个聚会很晚了,但我写了一个插件来将原始 TCP 套接字路由到 Heroku (https://addons.heroku.com/ruppells-sockets) 以支持我正在从事的项目。它是测试版,所以要温柔。

如果您仍然需要此功能,我很想得到一些反馈。 插件的文档链接到示例 nodejs TCP 和 Websocket 聊天服务器以获得灵感。

【讨论】:

  • 开枪,我迟到了。这是停产了吗?该链接返回 404
  • 不晚于我回复。恐怕它已经停产了,我没有足够的带宽来维护插件。如果您的用例是 heroku 上的 websockets,我认为 Heroku 路由器现在完全支持它
猜你喜欢
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多