「複数人参加のリアルタイム通信アプリを作る。(クライアント編)」で先にクライアントサイドだけ紹介しましたが、最後にサーバサイドの実装を紹介します。
wsのオブジェクトを作成
クライアントが1人で、他のクライアントと関連を持たない場合は、「Node.jsでWebSocketサーバを立てる」で紹介したように非常に簡単な実装でできます。
複数人参加の場合は、少し実装が変わりますが、WebSocketServerのオブジェクトを生成する部分については変わりません。
var WebSocketServer = require('ws').Server
var wss = new WebSocketServer({
host : '0.0.0.0',
port : 8080
});
複数人参加のために追加すべきこと
では複数人が参加した場合に何を追加しなければならないでしょうか。
- 誰が参加しているかを保持し、ユーザーの移動を他の全員に通知する。(コネクションの管理)
- ユーザーがそれぞれどこにいるかを管理する。(ユーザーの管理)
この二つです。
コネクションの管理
ここでは簡単のために、コネクションが確立された時に、全てのコネクションをグローバルな配列で保持することにします。
もう一つの必要な機能は、その保持しているコネクションの全てにプッシュ配信する機能です。次のように実装したbroadcast()関数にプッシュ通知したい文字列を渡すと、その配列に入っているコネクション全てに対して1つずつデータを送信します。
var connections = [];
function broadcast(message) {
connections.forEach(function(socket, i) {
try {
socket.send(message);
} catch(e) {
}
});
}
ここではコネクションの切断の管理などをしないので、sendメソッドが呼べなかった時の対策として、例外を握りつぶしてしまいます。
ユーザーの管理と位置座標の配信
ユーザーの位置座標の情報も、グローバルな配列でもつことにします。
var userLocation = [];
wss.on('connection', function(ws) {
var userId = connections.length;
connections.push(ws);
ws.on('message', function(message) {
userLocation[userId] = JSON.parse(message);
pushMessage = JSON.stringify(userLocation);
broadcast(pushMessage);
});
});
コネクションが張られるごとに、そのコネクションに対して連番のユーザーIDを振ります。ユーザーIDは配列のインデックスと対応していて、そのユーザーの位置座標を格納しています。
参加者の誰かがサーバに自分の位置座標を送信すると、サーバ側ではその人の位置座標を更新して、全員に最新の位置座標配列を配信します。
この配信の部分に、先に実装したbroadcast()関数を使っています。
まとめ
このような簡単なサンプルを作ることに関していえば、WebSocketもNode.jsもそれなりにライブラリが揃っていて、決して難しくはありませんでした。ここからの課題は、Node.jsの分散をどうするか、ということになります。
これでWebSocketに関してのブログはいったん終わりですが、Node.jsの分散についてまた調べて書きたいと思います。
コメント