サーバー側のソースコードはこんな感じ
受け取ったメッセージをブロードキャストするシンプルなコードです
送信元にも送信しちゃいます
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 件のコメント:
コメントを投稿