WebSocket 接続ではなく、TCP 接続のみを許可する既存のサーバーに接続する必要がある Web アプリに取り組んでいます。最新のブラウザーでは TCP ソケットが許可されていないため、私が思いついた解決策は、どこかに websockify ( https://github.com/kanaka/websockify )の形式でミドルウェアをセットアップすることです。特定の websocket ポートで一度実行すると、受信したメッセージがこのポートからサーバーにルーティングされ、サーバーからアプリに戻されます。この設定により、アプリの多くのインスタンスを一度に実行し、実行中のミドルウェアの単一のインスタンスを介してルーティングできます。これは素晴らしいことです。これはローカルではうまく機能しますが、Heroku での設定に問題があります。
私Procfile
の見た目は次のようになります(サーバーホストとポートは省略されています):
web: bundle exec puma -p $PORT
startserver: bundle exec ruby websockify.rb $PORT [server_host]:[server_port]
変更を Heroku にプッシュした後、コマンド ラインに入力すると、次のheroku run startserver
ように応答します (たとえば)。
Starting server on :13689
0: {"listen_host"=>nil, "listen_port"=>13689, "target_host"=>[server_host], "target_port"=>[server_port]}
、それが機能していることを示しているようです。しばらくの間、2 つの $PORT が同じ値であると想定していましたが、これは意図的な動作だと思いますが、websocket は Web アプリケーションとは異なるポートにバインドします。それでも、javascript コンソールを介しても、WebSocket に接続できないようです。コンソール用の関数を書きました:
function test_port(schema, port) {ws = new WebSocket(schema + "://" + window.document.location.host + port, ["binary"]); ws.binaryType = "arraybuffer"; ws.onmessage = function(msg) {console.log(msg);}; ws.onclose = function() {console.log("Closed");};};
この関数をいくつかの異なる入力で実行して、(私以外に)何が失われているのかを突き止めようとしました。
> test_port("ws", ":13689"); // the port it should be listening on
Closed
> test_port("ws", ":42069"); // web app's port
Closed
> test_port("ws", ":5555"); // nonsense number
Closed
> test_port("ws", ""); // use default
Unexpected response code: 200
Closed
> test_port("ws", ":80"); // default
Unexpected response code: 200
Closed
> test_port("wss", ":13689");
Closed
> test_port("wss", ":42069");
Closed
> test_port("wss", ":5555");
Closed
> test_port("wss", ""); // use default
Unexpected response code: 200
Closed
> test_port("wss", ":443"); // default
Unexpected response code: 200
Closed
これらのどれも機能していないようです。デフォルトでは、すぐに終了する前に HTTP OK 応答が返されますが、Chrome には、意図した 101 ではなく 200 で失敗するバグがあるようです。websockify の起動時にポートを直接 443 に設定すると、バインド エラーが発生します。それらのポートを介してバインドします。
ブラウザからミドルウェアに接続する方法がわかれば、アプリケーションの残りの部分を理解できると思います。私が間違っていることについて誰かが何か考えを持っていますか? 近づいたような気がしますが、他に何ができるかわかりません。プロジェクトのトラブルシューティングに役立つ情報が必要な場合はお知らせください。前もって感謝します。