简单的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聊天服务器的灵感。