var avi = require('http').createServer(handler)
, io = require('socket.io').listen(avi)
, fs = require('fs')
avi.listen(3000);
function handler (req, res) {
console.log(__dirname);
}
var userinfo = [];//클라이언트 전송용
io.sockets.on('connection', function (socket) {
socket.room = "livingRoom";//기본은 livingRoom 이다.
/* 대화방 전체 입장 */
socket.on('systemIn', function (data) {
//console.log(data);
if(data.name)
{
//최초 입장시 아이디/소켓코드 저장
socket.nickname = data.name;
var obj = {socket_id:socket.id, nickname:data.name, room:socket.room};
userinfo.push(obj);
io.sockets.emit('systemIn',data);
}
});
/* 대화방 나가기 */
socket.on('systemOut',
function (data)
{
socket.emit("systemOut", data);
socket.broadcast.emit("systemOut", data);
});
/* room 으로 입장 */
socket.on('switchRoom',
function(newroom) {
var data = {};
//사용자 룸 변경
replaceRoom(newroom);
socket.leave(socket.room);
// join new room, received as function parameter
socket.join(newroom);
socket.emit('updatechat', 'SERVER', 'you have connected to '+ newroom);
data = mkmessageTxt("public", socket.nickname, socket.nickname+'님이 퇴장했습니다.');
io.sockets.in(socket.room).emit('message', socket.nickname, data);
// update socket session room title
socket.room = newroom;
//socket.broadcast.to(newroom).emit('updatechat', 'SERVER', socket.nickname+' has joined this room');
data = mkmessageTxt("public", socket.nickname, socket.nickname+'님이 입장했습니다.');
io.sockets.in(newroom).emit('message', socket.nickname, data);
//현재 방의 사용자 리스트 변경
refreshUserList();
});
/* 대화시작 */
socket.on('updatechat', function (data) {
if(data.type == 'public')
{
io.sockets.in(socket.room).emit('message', socket.nickname, data);
}
else
{
io.sockets.in(socket.room).sockets[socket.id].emit('message',socket.nickname,data);//본인에게 메시지 전달
io.sockets.in(socket.room).sockets[data.type].emit('message',socket.nickname,data);//귓속말 상대자에게 메시지 전달
}
});
/* 브라우저를 닫은 경우 현재 방에서 퇴장하는 것으로 처리*/
socket.on('disconnect', function () {
if(socket.nickname){
data = mkmessageTxt("public", socket.nickname, socket.nickname+'님이 퇴장했습니다.');
io.sockets.in(socket.room).emit('message', socket.nickname, data);
deleteUser();//
}
});
/* 현재 채팅방의 사용자 리스트 가져오기 */
var getRoomUsers = function(){
var userList = [];
for (var i in userinfo) {
if(userinfo[i].room == socket.room){
userList.push(userinfo[i]);
}
}
return userList;
}
/* 현재 사용자의 채팅방 변경 */
var replaceRoom = function(roomname){
for (var i in userinfo) {
if(userinfo[i].socket_id == socket.id){
userinfo[i].room = roomname;
}
}
}
/* 현재 사용자 삭제 (시스템을 떠났을 경우) */
var deleteUser = function(){
for (var i in userinfo) {
if(userinfo[i].socket_id == socket.id){
delete userinfo[i];
userinfo.splice(i, 1)
}
}
refreshUserList();
}
var mkmessageTxt = function(type, nickname, msg){
var message = {type : type, name : nickname, message : msg}
return message;
}
/* 사용자 목록 갱신 */
var refreshUserList = function(){
var userList = getRoomUsers();
io.sockets.in(socket.room).emit('systemList',userList);
}
});
<meta charset="UTF-8">
<title>우리들의 일상</title>
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
<script type="text/javascript">
$(function(){
var nick_name = '';
var socket = io.connect('http://localhost:3000');
$("#enter").click(function(){
nick_name = $('#nick_name').val();
if(nick_name == "")
{
alert('닉네임을 입력하세요');
}
else
{
socket.emit('systemIn',{
name : nick_name
});
$("#door").slideUp(200).delay(200,function(){
$("#room").slideDown(200);
});
}
});
$(".room").click(function(){
var room = $(this).val();
socket.emit('switchRoom', room);
$("#room").slideUp(200).delay(200,function(){
$("#chat").slideDown(200);
});
});
socket.on('systemList',function(data){
$("#nick_lst").empty();
$("#nick_lst").append('<option value="public">모두</option>');
for (var i in data) {
$("#nick_lst").append('<option value="'+data[i].socket_id+'">'+data[i].nickname+'</option>');
}
});
socket.on('systemIn',function(data){//전체 시스템에 로그인시(대화방으로는 가기전) 별도 전체 창에서 공지
});
socket.on('systemOut',function(data){//전체 시스템에 로그아웃시(대화방으로는 가기전)
});
socket.on('message',function(usesrname, data){//전체 시스템에 로그아웃시(대화방으로는 가기전)
$('#msg').append('<dt>'+usesrname+' : </dt><dd>'+data.message+'</dd>');
scrollDonw();
});
$("#txt").keypress(function(ent){
if(ent.which == 13){
$("#input").click();
}
});
$("#input").bind('click',function(){
socket.emit('updatechat',{
type : $("#nick_lst").val(),
name : nick_name,
message : $("#txt").val()
});
$("#txt").val('');
});
});
function scrollDonw()
{
$("#msg").animate({'scrollTop':$("#msg")[0].scrollHeight},200);
}
</script>
</head>
<body>
<section id="wrap">
<header>
<body style="background-color:powderblue;">
<h1>이런저런 사는 이야기</h1>
</header>
<section>
<div id="door">
닉네임 : <input type="text" id="nick_name" value="">
<button type="button" id="enter">입장하기</button>
</div>
<div id="room">
대화방선택 :
<input type="button" class="room" value="10대방">
<input type="button" class="room" value="20대방">
<input type="button" class="room" value="30대방">
<input type="button" class="room" value="40대방">
<input type="button" class="room" value="50대방">
<input type="button" class="room" value="직장인들을 위한방">
<input type="button" class="room" value="여자들의 방">
</div>
<div id="group_select">
성별:
<select name="group_select" id="group_select">
<option value="a">남성</option>
<option value="b">여성</option>
</select>
<div id="chat">
<dl id="msg">
</dl>
<div id="edit">
<select name="nick_lst" id="nick_lst">
<option value="public">모두에게</option>
</select>
<input type="text" name="txt" id="txt">
<button id="input">전송</button>
</div>
</div>
</section>
</section>
</body>
</html>