####Node.js + express + socket.io で画像を返すチャットルーム
- 参考URL
https://github.com/Jxck/socket.io/wiki/Rooms
- roomListというオブジェクトを作っておく。
- クライアント側からルーム名が送信される
- roomListに同一のルーム名がある場合→入室し人数を+1、ない場合→ルームを作成(サーバー側で振り分け)
- チャットはsetされたルームへ送信
- 退出時、ルーム人数が0になればroomListから削除
- 3 roomListに同一のルーム名があるかないかで振り分け
var count = 0; //接続人数
var roomList = new Object();
io.sockets.on('connection', function(socket) {
count++; //接続人数をインクリメント
io.sockets.emit('count', count);
if(roomList){
io.sockets.emit('roomList',roomList);
}
//ルームが作られていればクライアントを更新
function upDateRL(roomList){
if (roomList){
io.sockets.emit('roomList', roomList);
}
}
socket.on("enter", function(data2){
var data2name = data2.value;
if(!roomList[data2name]){
roomList[data2name] =1;
socket.set('room', data2name);
socket.join(data2name);
io.sockets.emit("roomList", roomList);
//ルーム名がroomListにない場合→ルーム作成
}else if(roomList[data2name]){
if(roomList[data2name] >= 1){
roomList[data2name]++;
socket.set('room', data2name);
socket.join(data2name);
io.sockets.to(data2name).emit('message', data2name + "に入室しました。")
upDateRL(roomList); //上で定義した関数
}
}
//ルーム名がroomListにある場合は入室
});
- 4 チャットはsetされたルームへ送信
socket.on('msg post', function(msg) {
var room;
socket.get('room', function(err, _room){ //ここがよくわからない① 調べる
room = _room;
});
io.sockets.to(room).emit('msg push', {name: msg.name, text: msg.text});
});
- 5 退出時、ルーム人数が0になればroomListから削除
socket.on('disconnect', function(){
count--;
var room;
io.sockets.emit('count', count);
socket.get('room', function(err, _room){ //ここの意味がよくわからない①
room = _room;
});
if(room){
roomList[room]--;
socket.leave(room);
if(roomList[room] < 1){
delete roomList[room];
io.sockets.emit("roomDel", roomList);
//参加人数が0人の場合、roomListから部屋を削除
}else{
io.sockets.to(room).emit('message', room + "を退室しました");
upDateRL(roomList); //上で定義した関数
}
}
});
$('#room_form').on('submit', function(){ //id = room_formのsubumitがリクエストされたとき
var num = $("#enter").val();
socket.emit("enter", {value: num}); //クライアント側からルーム名送信
socket.on("roomList", function(roomList){
$("#list-box").text("");
if(roomList){
for(var j in roomList){
$("#list-box").append("ルーム『"+ j + "』に" + roomList[j] +"人います<br>"); //listbox(roomlistを表示)書き換え
}
}
});
socket.on("roomDel",function(roomList){ //ここの意味がよくわからない② 調べる
$("#list-box").text("");
if(roomList){
for(var k in roomList){
$("#list-box").append(k);
}
}
});
});
- 動作確認はできたが、意味がわからない箇所がいくつかあるので調べたりコメントアウトしてみたりして内容を確認する。
- 同様に、不要と思われる部分もあるので確認する。
- いったんルームAに入室し、切断せずにルームBに入室したときにlistboxに反映されない不具合。
(接続はルームBにされているので、チャットは問題なく動作する)
- だいぶ長い。
- もう少し精査します。
server.jsにいくつか落とし穴があるように思えます.伊東さんも交えてコードリーディングしながら,レビューした方が良いでしょうかね?