Node js Socket IO 예제
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var userList = [];
var typingUsers = {};
app.get('/', function(req, res){
res.send('<h1>AppCoda - SocketChat Server</h1>');
});
http.listen(3000, function(){
console.log('Listening on *:3000');
});
//소켓 연결 완료
io.on('connection', function(clientSocket){
console.log('a user connected');
//연결이 종료되었을때
clientSocket.on('disconnect', function(){
console.log('user disconnected');
var clientNickname;
for (var i=0; i<userList.length; i++) {
if (userList[i]["id"] == clientSocket.id) {
userList[i]["isConnected"] = false;
clientNickname = userList[i]["nickname"];
break;
}
}
delete typingUsers[clientNickname];
io.emit("userList", userList);
io.emit("userExitUpdate", clientNickname);
io.emit("userTypingUpdate", typingUsers);
});
//유저가 채팅방을 완전히 종료하고 나갔을때..
clientSocket.on("exitUser", function(clientNickname){
for (var i=0; i<userList.length; i++) {
if (userList[i]["id"] == clientSocket.id) {
userList.splice(i, 1);
break;
}
}
io.emit("userExitUpdate", clientNickname);
});
//유저가 메시지 전송할때
clientSocket.on('chatMessage', function(clientNickname, message){
var currentDateTime = new Date().toLocaleString();
delete typingUsers[clientNickname];
io.emit("userTypingUpdate", typingUsers);
io.emit('newChatMessage', clientNickname, message, currentDateTime);
});
//유저 연결
/*
유저가 새로운 유전지 아닌지 판단한다.
새로운 유저라면 내부의 배열(client ID, nickname, 연결상태)를 저장하고,
아니면 연결 상태를 true로 업데이트 한다.
업데이트 된 유저 리스트를 return한다.
*/
clientSocket.on("connectUser", function(clientNickname) {
var message = "User " + clientNickname + " was connected.";
console.log(message);
var userInfo = {};
var foundUser = false;
for (var i=0; i<userList.length; i++) {
if (userList[i]["nickname"] == clientNickname) {
userList[i]["isConnected"] = true
userList[i]["id"] = clientSocket.id;
userInfo = userList[i];
foundUser = true;
break;
}
}
if (!foundUser) {
userInfo["id"] = clientSocket.id;
userInfo["nickname"] = clientNickname;
userInfo["isConnected"] = true
userList.push(userInfo);
}
io.emit("userList", userList);
io.emit("userConnectUpdate", userInfo)
});
//타이핑 시작했을때 상대방
clientSocket.on("startType", function(clientNickname){
console.log("User " + clientNickname + " is writing a message...");
typingUsers[clientNickname] = 1;
io.emit("userTypingUpdate", typingUsers);
});
//유저가 타이핑 종료했을때
clientSocket.on("stopType", function(clientNickname){
console.log("User " + clientNickname + " has stopped writing a message...");
delete typingUsers[clientNickname];
io.emit("userTypingUpdate", typingUsers);
});
});
참고