サーバー側のソースコードはこんな感じ
受け取ったメッセージをブロードキャストするシンプルなコードです
送信元にも送信しちゃいます
var webSocket = require('websocket.io'); var server = webSocket.listen(8080, function() { console.log('connect'); }); server.on('connection', function(socket) { socket.on('message', function(data) { server.clients.forEach(function(client) { client.send(data); }); }); });
実際に動作させてクライアントを切断すると、例外が出たり出なかったり・・・
例外を表示してやると
[TypeError: Cannot call method 'send' of null]
とのことで、明らかにclientにnullが代入されてしまっています
タイミング的な問題だったら面倒だなぁと思いつつ、websocket.ioのソースコードを見てみたら別に何のことはない処理が原因でした
https://github.com/LearnBoost/websocket.io/blob/master/lib/server.js
66行目あたり
client.on('open', function() { if (self.options.clientTracking) { var i = null; if (self.clientsNull.length) { i = self.clientsNull.shift(); self.clients[i] = client; } else { i = self.clients.length; self.clients.push(client); } self.clientsCount++; client.on('close', function () { self.clients[i] = null; self.clientsNull.push(i); self.clientsCount--; }); }
client.on('close'... でclientsにnullが突っ込まれてます
さらに、clientNullでnullのインデックスを記録しといて、配列長を節約している模様
つまり、Server#clientsには現在接続中のクライアントと、null値が混在しているので
きちんとnullチェックをしてあげましょうということ
ついでに言えば、現在接続中のクライアント数を取得するには、Server#clients.lengthではなくServer#clientsCountを参照する必要があります
というわけで、最初のコードは以下のような感じになります
var webSocket = require('websocket.io'); var server = webSocket.listen(8080, function() { console.log('connect'); }); server.on('connection', function(socket) { socket.on('message', function(data) { server.clients.forEach(function(client) { // nullははじこう if (client != null) { client.send(data); } }); }); });
ドキュメントに書いてありそうな内容ですが、今のところまだ見つけられず
ソース見てねってことなのかな
0 件のコメント:
コメントを投稿