2015-01-03 2 views
0

저는 nodejs 및 socket io에 익숙하지 만 실제로 어떻게 작동하는지 이해하려고합니다. 이미 소켓 io 웹 사이트에서 "chat tutorial"을 완료했습니다. 그러나, 나는 "새로운"무언가를 여기에서하는 것을 시도하고있다. 새 연결이 설정 될 때마다 임의의 번호가있는 새 탭을 추가하여 모든 클라이언트에 이벤트를 브로드 캐스트하려고합니다. 그러나 일어나는 유일한 일은 한 번 (내 자신의 연결에서)하지만 다른 사람들에게는 아무 것도 추가하지 않는다는 것입니다. 이것이 가능하지 않습니까, 아니면 제가 잘못하고있는 것입니까?nodejs 및 socket io 동기화 문제

서버,

var express = require('express'); 
var app = express(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

app.use("/assets/stylesheets", express.static(__dirname + '/assets/stylesheets')); 
app.use("/assets/javascripts", express.static(__dirname + '/assets/javascripts')); 
app.use("/assets/demo/avatars", express.static(__dirname + '/assets/demo/avatars')); 
app.use("/assets/fonts/font-awesome/", express.static(__dirname + '/assets/fonts/font-awesome/')); 

app.get('/dashboard', function(req, res){ 
    res.sendFile(__dirname + '/dashboard.html'); 
}); 

io.on('connection', function(socket) { 

    socket.on('new user', function(username) { 
     socket.emit('new connection', { nickname: username }); 
     console.log('new connection ' + username); 
    }); 

}); 

http.listen(3000,function() { 
    console.log('Listening *:3000'); 
}); 

클라이언트,

<script type="text/javascript"> 

    var randomNumber = Math.floor((Math.random() * 10) + 1); 

    var socket = io(); 

    socket.on('connect', function() { 
     socket.emit('new user', randomNumber); 
    }); 

    socket.on('new connection', function(data) { 
     var nickname = data.nickname; 
     $('<li class="active"> <a href="#' + nickname + '" data-toggle="tab">' + nickname + '<span class="label label-success">12</span></a> </li>').appendTo("#uidemo-tabs-default-demo"); 
    }); 

</script> 

답변

0

을 모든 연결에 메시지를 보내려면 사용자는 서버의 모든 열려있는 연결 목록을 유지해야하고, 새로운 연결이 발생하면, 다른 모든 연결에 메시지를 보내 . 여기

이 Node.js를 서버가 하나의 인스턴스 (즉, 당신이 cluster 모듈을 사용하지 않는) 경우에만 동작 인식, 그러나 코드를

var express = require('express'); 
var app = express(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var connections = []; 

app.use("/assets/stylesheets", express.static(__dirname + '/assets/stylesheets')); 
app.use("/assets/javascripts", express.static(__dirname + '/assets/javascripts')); 
app.use("/assets/demo/avatars", express.static(__dirname + '/assets/demo/avatars')); 
app.use("/assets/fonts/font-awesome/", express.static(__dirname + '/assets/fonts/font-awesome/')); 

app.get('/dashboard', function(req, res){ 
    res.sendFile(__dirname + '/dashboard.html'); 
}); 

io.on('connection', function(socket) { 

    socket.on('new user', function(username) { 
     connections.forEach(function (socket) { 
      try { 
       socket.emit('new connection', { nickname: username }); 
      } catch (err) { 
       console.log('connection probably closed: ', err); 
      } 
     }); 
     console.log('new connection ' + username); 
     connections.push(socket); 
    }); 

}); 

http.listen(3000,function() { 
    console.log('Listening *:3000'); 
}); 
을 수정, 더 많은 작업이 필요합니다 중복 된 인프라에서 작동해야하는 경우 클러스터에서 작동하도록 설정하는 것이 좋습니다.

+0

아, 알겠습니다! 고마워, 그 위대한 일했습니다! –

0

당신은

socket.on('new user', function(username) { 
    socket.broadcast.emit('new connection', { nickname: username }); 
    console.log('new connection ' + username); 
}); 

그러나이 자신의 연결로 메시지를 전송하지 않습니다 .. 방송 socket.broadcast.emit를 사용해야하지만, 다른 모든 연결에 연결합니다. 당신이 자신을 포함

socket.on('new user', function(username) { 
    socket.emit('new connection', { nickname: username }); 
    socket.broadcast.emit('new connection', { nickname: username }); 
    console.log('new connection ' + username); 
}); 
관련 문제