node.js のサーバー側ロジックを使用して html5 でゲームを実行しようとしていますが、それは生の Websockets (Socket.IO ではなく、バイナリ データが必要です) を使用します。複数の「部屋」、つまり複数の websocket サーバーが必要で、すべてが個別の URL を持ちます。現在、各 Websocket サーバーを特定のポートに接続し、アップグレード要求を URL に基づいて適切なポートにプロキシする方法のみを見つけました (どのように機能するかは完全にはわかりません)。
それは私のコンピュータで動作します。問題は、PaaS プロバイダー (AppFog) に送信しようとすると、提供された http ポート以外のポートを開くことが許可されていないため、コードが失敗することです。
これが私のコードのかなり明確なバージョンです:
//start web server (basic static express server) on 8080
// ...
//start game server and listen to port 9000
// I use the ws module for websockets
// I plan to have a couple of these "game servers"
// ...
//open the proxy server.
var httpProxy= require('http-proxy');
var webProxyServer = httpProxy.createServer(function (req, res, proxy){
// I need http requests to be redirected to the "game servers"
if(req.url.substring(0, "/room1".length) === "/room1") // if starts with "/room1"
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 9000
});
else
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 8080
});
}
webProxyServer.on('upgrade', function (req, socket, head) {
//redirecting logic goes here
if(req.url=="/room1/"){
webProxyServer.proxy.proxyWebSocketRequest(req, socket, head, {
host: 'localhost',
port: 9000
})
}
});
webProxyServer.listen(8000); //the "outside port".
私の質問: 特定のポートをリッスンせずに websocket サーバーを開き、ソケットを手動でそれらに接続して、基本的な http ポート以外のポートを開く必要がないようにすることは何とか可能ですか? 私はSocket.IOが何とかそれを行うことを知っています。http サーバーのアップグレード イベントをリッスンして、ソケットを正しい WebSocket サーバーに渡す方法があるのではないでしょうか?
私はサーバー側のものにはかなり慣れていないので、あちこちで追加情報を歓迎します.