1

単純なeventmachineWebソケットサーバー(eventmachine 1.0.0)があります。

EM.run {

  # WebSocket Server
  EM::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
    ws.onopen do
      sid = @channel.subscribe{|msg| ws.send msg }
      puts "* new WebSocket client <#{sid}> connected!"
    end

    ws.onmessage do |msg|
      puts "* websocket client <#{@sid}> : #{msg}"
    end

    ws.onclose do
      @channel.unsubscribe(sid)
      puts "* websocket client <#{@sid}> closed"
    end
  end
}

次のコードを使用して、JavaScriptクライアントを介して接続しようとしています。

socket = new WebSocket("ws://localhost:8080");

socket.onopen = function(e) {
  socket.send('Connesso');
};

socket.onmessage = function(mess) {
  if (mess) {
    socket.send(mess);
  }
};

socket.onclose = function(e) {
  socket.send('Disconnesso');
};

以前のバージョンのサファリでは、クライアントがサーバーに接続していない最新バージョンで問題なく動作していました。

前回のChromeDev安定版でも試してみましたが、動作しません。

Webソケットヘッダーが送信されますが、保留状態のままです。

Webソケットにテキストメッセージを送信すると、を受け取りますINVALID_STATE_ERR: DOM Exception 11

ドラフトの変更があるのを見ましたが、em-websocket0.3.8はすでにそれを実装していると思いました。

この問題の解決を手伝ってもらえますか?

どうもありがとう

4

1 に答える 1

0

INVALID_STATE_ERR:DOM例外11は、WebSocketがまだ準備完了状態にないことを意味します。

socket.readyStateでwebsocketオブジェクトの状態を確認できますsocket.readyState==1のときにメッセージを送信できます

タイムアウトを使用して、これのターンアラウンドを作成しました

timerId = setInterval(sendDataWhenReady, 1000);
function sendDataWhenReady(){
  if(socket.readyState == 1){
    ws.send(JSON.stringify({"type": 'STATUS', "status": status, "username": logged_in_user}))
    clearInterval(timerId);
  }
}
于 2012-11-09T06:45:12.723 に答える