DRYな備忘録

Don't Repeat Yourself.

WebSocketのsend()でUncaught Error: InvalidStateError: DOM Exception 11 【WebSocket】【JavaScript】

【問題】

WebSocketでチャットアプリを(謎にPythonで)作ろうと思った。サーバサイドは問題なく動いて、サーバサイドでの websocket.send('Hi, this is Server!!') はクライアントのwebsocket.onmessageで取れてる。しかし、クライアント側のwebsocket.send('Hi, this is Client!!'); は、以下のエラーが出る。

Uncaught Error: InvalidStateError: DOM Exception 11 

( ´゚д゚`)エー

【コード】

クライアント側のコードはコレ

$(function(){
  socket = new WebSocket("ws://otiai10.com:9090/chat");
  socket.onmessage = function(ev){
    console.log('On Message Event =>', ev);
  }
  socket.send('Hi, this is Client!!');
});
// jquery使ってます

【調査】

特にこれ

えーブラウザのWebSocketが準拠しているドラフトと、サーバ側のドラフトが違うんじゃねえの疑惑。そんなんめんどくさいorz

【待てよ?】

ブラウザのコンソール

f:id:otiai10:20130621185249p:plain

onmessageイベントがsendよりも後に起きていることが分かる。まーソケットつながってサーバがメッセージ送ってくるのにタイムラグがあるのは当然だが、そういえばJSの一部メソッド、特に通信とかトランザクションって非同期でしたよね...

【解決】

JS変えた

$(function(){
  socket = new WebSocket("ws://otiai10.com:9090/chat");
  socket.onmessage = function(ev){
    console.log('On Message Event =>', ev);
  }
  // socketが開いてはじめて発動するイベントリスナー
  socket.onopen = function(ev){
    console.log('On Open Event =>', ev);
    socket.send('Hi, this is Client!!');
  }
});

そしたら

f:id:otiai10:20130621190040p:plain

エラー無くクライアントからサーバへメッセージ送れてるし、サーバもそれをエコーできてる!

【まとめ】

  • Uncaught Error: InvalidStateError: DOM Exception 11
  • ぱっと見よく分かんないエラーだけど
  • それ単にsocketが準備できてないだけかもよ☆(ゝω・)v テヘペロ

f:id:otiai10:20130621191600j:plain

【雑感】

  • アサカツおじさんはじめました
  • サーバサイドをPythonで書いてるんだけど、コードがさっぱりしててかなり好き



DRYな備忘録