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

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

我的第一个尝试是build立一个基于socket.io的服务器。 它的工作原理,但我不喜欢的事实,iOS应用程序使用长轮询,而不是WebSocket或TCP套接字与服务器交谈。

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

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); 

如果我在本地部署这个node.js服务器代码,我可以使用Terminal作为testing客户端成功地发送和接收聊天到TCP服务器

 nc localhost 5000 

但是,如果我在heroku中部署这个服务器代码,我不能再与服务器build立一个tcp连接。

我的理解是服务器将在process.env.PORT中侦听。

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

那么如果我尝试用这种方式连接:

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

什么都没发生。

我想我有一些根本的误解。 任何人都可以指导我? 在Heroku服务器上可以使用真正的TCP套接字聊天

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

而不是直接使用套接字,你可以使用像socket.io支持多个传输。

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

此外,您的应用正在监听的端口, eg 30134由nginx从您的端口​​80上的heroku主机名代理到您在heroku内部networking上的应用端口。

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

如果你仍然需要这个function,我会热衷于获得一些反馈。 插件的文档链接到一个示例nodejs TCP和Websocket聊天服务器的灵感。