14

Web ソケットを使用する Web アプリケーションを作成しました。私のアプリは、起動時に最近接続されたホストに自動接続しようとするという考えです。それらのいずれにも接続を確立できない場合は、ユーザーを接続部分に誘導し、手動で接続を確立するように求めます。

これはすべて機能します。要約すると、既知の各ホストを順番に試行し、200 ミリ秒後に接続されていない場合 (`readyState != 1)、次のホストを試行します。これらのホストはすべて LAN 上にある必要があるため、200 ミリ秒はかなり確実に機能します。リストの最後の 1 つでも失敗した場合、Web はユーザーにホストを手動で入力するように指示するモーダルを開きます。

問題は、自動接続を試みることで、試みたホストに Websocket を作成する必要があり、次のようなエラー メッセージがコンソールに出力されることです。

'ws://lightmate:8080/' への WebSocket 接続に失敗しました: 接続の確立中にエラーが発生しました: net::ERR_NAME_NOT_RESOLVED

'ws://localhost:8080/' への WebSocket 接続に失敗しました: 接続の確立中にエラーが発生しました: net::ERR_CONNECTION_REFUSED

決して致命的な欠陥ではありませんが、見苦しく、デバッグの邪魔になります。

への呼び出しを try/catch ブロックで囲んで削除しようとしましたが、エラーは引き続き発生します。また、エラー メッセージが抑制されることを期待してnew WebSocket(address)、ハンドラーを設定しようとしました。onerror何も機能していません。

connect: function(){
  var fulladdr = completeServerAddress(address);
  try {
    connection = new WebSocket(fulladdr);
    connection.suppressErrorsBecauseOfAutoConnection = suppressErrorsBecauseOfAutoConnection; //Store this module-scoped variable in connection, so if the module changes suppression state, this connection won't.
  } catch (e){
    //Make sure we don't try to send anything down this dead websocket
    connection = false;
    return false;
  }
  connection.binaryType = "arraybuffer";
  connection.onerror = function(){
    if (connection !== false && !connection.suppressErrorsBecauseOfAutoConnection){
      Announce.announceMessage("Connection failed with server");
    }
    connection = false;
  };
  connection.onmessage = function(m){
    rxMessage(ConnectionProtocol.BaseMessage.parseChunk(m.data));
  };
  connection.onclose = function(){
    hooks.swing("disconnected", "", 0);
    if (connection !== false && !connection.suppressErrorsBecauseOfAutoConnection){
      Announce.announceMessage("Connection lost with server");
    }
  };
  connection.onopen = function(){
    sendMessages(ConnectionProtocol.HandshakeMessage.create(name, sources, sinks));
    while (idlingmessages.length){
      websocketConnection.send(idlingmessages.splice(0,1)[0]);
    }
    hooks.swing("connected", "", 0);
  };
},

Dupl Disclaimer: この質問は、この StackOverflow の質問に似ていますが、その質問は 1 年も前のものであり、「できない」というコンセンサスがありました。それ以来、状況が変わったことを願っています。

4

1 に答える 1