1

heroku上にnode.jsチャットサーバーを構築したかったのですが、チャットクライアントはiOSアプリになります。

私の最初の試みは、socket.ioに基づいてサーバーを構築することです。それは機能しますが、iOSアプリがwebsocketやtcpソケットの代わりに長いポーリングを使用してサーバーと通信しているという事実は好きではありません。

したがって、2番目の試みは、実際の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);

このnode.jsサーバーコードをローカルホストにデプロイすると、ターミナルをテストクライアントとして使用して、TCPサーバーとのチャットを正常に送受信できます。

nc localhost 5000

しかし、このサーバーコードをherokuにデプロイすると、サーバーとのtcp接続を確立できなくなりました。

私の理解では、サーバーはprocess.env.PORTでリッスンします。

そこで、最初にサーバーがリッスンしているこのポート(30134など)をトレースしました。

次に、この方法で接続しようとすると、次のようになります。

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

何も起こりません。

どこかで根本的な誤解があると思います。誰かが私を導くことができますか?HerokuサーバーでRealTCPソケットチャットは可能ですか?

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ソケットを直接使用する代わりに、複数のトランスポートをサポートするようなものを使用できます。

これは、nginxWebソケットを完全にサポートしていなかった古いバージョンを使用しているためです。

さらに、アプリがリッスンしているポートは、e.g. 30134nginxによってポート80のherokuホスト名からherokuの内部ネットワークのアプリポートにプロキシされます。

于 2013-03-06T09:30:51.757 に答える
2

私はこのパーティーに非常に遅れていることを知っていますが、私が取り組んでいたプロジェクトをサポートするために、生のTCPソケットをHeroku( https://addons.heroku.com/ruppells-sockets )にルーティングするアドオンを作成しました。非常にベータ版なので、優しくしてください。

それでもこの機能が必要な場合は、フィードバックをお待ちしています。アドオンのドキュメントは、インスピレーションを得るためにサンプルのnodejsTCPおよびWebsocketチャットサーバーにリンクしています。

于 2014-06-19T06:28:25.610 に答える