简单的TCP套接字聊天服务器在heroku上不起作用

时间:2013-03-06 09:22:23

标签: node.js heroku

我想在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服务器代码,我可以使用Terminal作为测试客户端成功发送和接收聊天到TCP服务器

nc localhost 5000

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

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

所以我首先找出服务器正在监听的端口,例如30134

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

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

什么都没发生。

我认为我在某处有一些根本的误解。谁能指导我?是否可以在heroku服务器上进行真正的TCP套接字聊天?

2 个答案:

答案 0 :(得分: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内部网络上的应用端口。

答案 1 :(得分:2)

我知道我参加这个派对已经很晚了但是我写了一个插件来将原始TCP套接字路由到Heroku(https://addons.heroku.com/ruppells-sockets)以支持我正在进行的项目。这是非常好的,所以要温柔。

如果您仍然需要此功能,我会热衷于获得一些反馈。 addon的文档链接到示例nodejs TCP和Websocket聊天服务器以获取灵感。