0

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 に設定すると、バインド エラーが発生します。それらのポートを介してバインドします。

ブラウザからミドルウェアに接続する方法がわかれば、アプリケーションの残りの部分を理解できると思います。私が間違っていることについて誰かが何か考えを持っていますか? 近づいたような気がしますが、他に何ができるかわかりません。プロジェクトのトラブルシューティングに役立つ情報が必要な場合はお知らせください。前もって感謝します。

4

1 に答える 1

0

私は、websockify はこの仕事には不適切なツールであるという結論に達しました。heroku アプリへの Websocket 接続はデフォルト ポート (ws の場合は 80、wss の場合は 443) にルーティングされますが、ポートにバインドしてアクセスすることはありません。それらを HTTP リクエストとして受け取り (私が思うに?)、それが Websocket 接続をリクエストしているかどうかを自分で確認する必要があります。websockify でこれができるかどうかはわかりませんが、それは私の実行方法ではなかったので、Ruby で独自の小さなミドルウェアを作成して、Websocket メッセージを TCP サーバーにルーティングする方が簡単でした。および websocket 接続を介した TCP メッセージ。このサイトhttps://devcenter.heroku.com/articles/ruby-websocketsの助けを借りて、websocket がどこに接続しようとするかがわかれば、かなり簡単でした。

于 2013-12-16T08:27:09.807 に答える