【問題】
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
【待てよ?】
ブラウザのコンソール
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!!'); } });
そしたら
エラー無くクライアントからサーバへメッセージ送れてるし、サーバもそれをエコーできてる!
【まとめ】
- Uncaught Error: InvalidStateError: DOM Exception 11
- ぱっと見よく分かんないエラーだけど
- それ単にsocketが準備できてないだけかもよ☆(ゝω・)v テヘペロ
【雑感】
- アサカツおじさんはじめました
- サーバサイドをPythonで書いてるんだけど、コードがさっぱりしててかなり好き
DRYな備忘録