1

我想在 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服务器上可以进行真正的TCP套接字聊天吗?

4

2 回答 2

2

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

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

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

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

于 2013-03-06T09:30:51.757 回答
2

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

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

于 2014-06-19T06:28:25.610 回答