2017-01-31 10 views
1

標準のPhoenix websocket/channel環境を設定しましたが、socket.jsを使用していません - チャンネルとトピックに接続する独自の(非常に単純な)コードがあります。しかし、私は1分程度以上持続するソケットを取得することはできません。ソケットのタイムアウトを定義する方法はありますか?Websocketのタイムアウトが早すぎます

const ws = new WebSocket(sock_url); 
ws.onmessage = (msg) => { 
    const { payload, event } = JSON.parse(msg.data); 
    if (!event.startsWith("phx_")) { 
    onMessage(payload.body); 
    } 
}; 
ws.onclose = (code, reason) => { 
    onClose(code, reason); 
}; 
ws.onopen =() => { 
    ws.send(JSON.stringify({ 
    topic: `users_socket:${user_id}`, 
    event: "phx_join", 
    payload: {}, 
    ref: '1' 
    })); 
}; 

更新:私はソケットを使用して終了し、私は次のように私のjavascriptのコードがある(ドキュメントごとなど、すべての標準)フェニックス側に

を特別な設定はありません。誰もが示唆したようにPhoenixに付属のjsファイル - 私は必要なものすべてを実行します。お答えいただき、ありがとうございました:)

+0

提供されたphoenixソケットモジュールを使用していない理由はありますか? –

+0

これは大きなライブラリの一部です。要求は、コードをシンプルで「外部」ライブラリから解放することでした。しかし、このタイプの問題が多すぎると、phoenixに付属のJSコードを使用することになります。 – user1595077

答えて

1

私はWebSocket(Go not PhoenixまたはElixirを使用)を使ってプロジェクトを開発しています。私は解決しなければならない切断問題と同じ問題を抱えていました。それ以来、WebSocketを「ping」する、つまり特定の間隔でメッセージを送信することによって)。

おそらく、あなたのJavascriptでこれを行うことができます。

ws.onopen =() => { 
    ws.send(/** YOUR CODE */); 

    // Send a ping event every 10 seconds 
    setInterval(() => ws.send(JSON.stringify({ event: "ping" })), 10000); 
} 

これに応じて、この新しいイベントタイプをサーバー側で処理します。また、oncloseイベントを監視し、その理由に応じて接続を再開することもできます。そのようなイベントコードのリストはMozilla docsにあります。

+0

ありがとう!私は似たような解決策を考えていましたが、Phoenixソケットの実装に何かが組み込まれているのだろうかと思っていました。そうでない場合、これを答えとしてマークします。 – user1595077

+2

Phoenixはまさにそのことをしています。https://github.com/phoenixframework/phoenix/blob/v1.2/web/static/js/phoenix.js#L546私は標準的な実装に固執することをお勧めします。 WebSocketをサポートしていないブラウザのフォールバック、接続の問題が発生した場合の自動再接続、クライアントがオフラインのときのメッセージのローカルバッファリング、プレゼンス情報の処理などが含まれます。それでも、ちょうど約500のLOC( 'cloc'で数えられる)です。また、バグの修正や公式クライアントへの更新の恩恵を受けることはありません。標準溶液を貼り付けることを強くお勧めします。 –

+0

@PatrickOscityありがとうパトリック。フェニックスやエリクシールとは一度も働いたことがないので、フレームワークの詳細はわかりませんでした。一般的なソリューションを提供しました。可能であれば、OPがフレームワークの機能を使用すべきであることに同意します。 –

1

phoenixバックエンドは、30秒ごとにpingを実行する予定です。

defmodule UserSocket do 
    use Phoenix.Socket 

    ## Transports 
    transport :websocket, Phoenix.Transports.WebSocket, 
    timeout: 300_000, # 5 minutes 
    transport_log: :debug 
    ... 

end 

タイムアウトを気にしない場合は、非常に高く設定できます。上記のコードでは5分に設定されています。

一般的に、phoenix.jsはこれをすべて実装します。それは非常に小さいlibです。あなたは最後に、あなたが間違っているものをたくさん持ってlibにあるすべてを実装しています:-)

関連する問題