我想在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套接字聊天?
答案 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聊天服务器以获取灵感。