2013-10-29 55 views
2

我正在设置一个非常基本的节点应用程序,计划是任何人都可以在网站上按下一个字母,然后递增计数器。随着世界各地的人们都在增加它,每个人都可以看到这种情况正在上升。 它的功能非常出色,除了我在开始时设置它的方式之后,节点服务器每秒接触每个客户端20次,这非常浪费。Nodejs,客户端并不总是收到服务器消息

所以为了避免这种情况,我添加了一个条件,即计数器必须增加以便节点服务器发送消息。但是当我这样做的时候,这些信息从来没有真正地让所有的客户知道,他们如何去客户端是一些混乱,显然是随机的顺序。

这是我的第一个节点应用程序,我仍然得到它的窍门,任何人都可以用这个指向正确的方向吗?问题可能在于increment_time函数。

服务器部分:

var http=require('http'); 
var io=require('socket.io'); 
var fs=require('fs'); 

var sockFile=fs.readFileSync('text'); 
server=http.createServer(); 

//2. get request, via port, http://localhost:8000 
server.on('request', function(req, res){ 
    console.log('request received'); 
    res.writeHead(200, {'content-type':'text/html'}); 
    res.end(sockFile); 
    }); 

//have server and socket listen to port 8000. 
server.listen(8000); 
var socket=io.listen(server); 

//the lower the number the less chatty the debug becomes. 
socket.set('log level', 1); 

//initiate the counter. 
counter=0; 
counterp=0; 


//3. on client connect. 
//http://<address>/apps/press_k 
socket.on('connection', function(socket){ 
    console.log("Client connected."); 

    //increment counter on clients command. 
    socket.on('s_increment_counter',function(data){ 
    counter++; 
    console.log('New counter:'+counter); 
    }); 

//send the counter to all clients if it has increased. 
increment_time_continuously(); 
function increment_time(){ 
    //this is the condition that is to limit how often node sends to the clients, 
    //but setting it on means the counter will be delivered in some erratic way 
    //to the clients. 
    //if(counter===counterp) {return;} 

    //send current counter to all clients. 
    console.log("passed the equals, now broadcast."); 
    //this part is clearly only sending to one of them. 
    socket.emit('c_display_counter', counter); 
    //client.broadcast.emit('c_display_counter', counter) 
    //client.send('Welcome client'); 

    counterp=counter; 
    } 
function increment_time_continuously(){setInterval(increment_time,50);} 
}); 

相关的客户端部分:

//client_to_server: 
//-tell server to increment counter. 
function s_increment_counter(){ 
    socket.emit('s_increment_counter',{counter:0}); 
    } 

//server_to_client: 
//-when server tells to display counter, display counter. 
socket.on('c_display_counter',function(counter){ 
    //counter=data["counter"]; 
    k_counter_text.attr({"text":counter}); 
    }); 

回答

1

的问题是,你不保存您的连接,当你与socket.emit广播只能进入你的最后一个连接,你需要存储已经连接到套接字的每个连接(在一个数组或其他东西中),然后遍历所有连接并广播你想要的消息。

var http=require('http'); 
var io=require('socket.io'); 
var fs=require('fs'); 

var sockFile=fs.readFileSync('text'); 
server=http.createServer(); 

//2. get request, via port, http://localhost:8000 
server.on('request', function(req, res){ 
    console.log('request received'); 
    res.writeHead(200, {'content-type':'text/html'}); 
    res.end(sockFile); 
    }); 

//have server and socket listen to port 8000. 
server.listen(8000); 
var socket=io.listen(server); 

//the lower the number the less chatty the debug becomes. 
socket.set('log level', 1); 

//initiate the counter. 
counter=0; 
counterp=0; 
connections = {}; 




function broadcastToConnections(){ 
    for(c in connections){ 
    var con = connections[c]; 
     con.emit('c_display_counter', counter); 
    } 
} 

function connectionClose(socket){ 
    delete connections[socket.id]; 
} 


//3. on client connect. 
//http://<address>/apps/press_k 
socket.on('connection', function(socket){ 
    console.log("Client connected."); 

    //increment counter on clients command. 
    socket.on('s_increment_counter',function(data){ 
     counter++; 
     console.log('New counter:'+counter); 

     broadcastToConnections(); 
    }); 

    connections[socket.id] = socket;//here we store our connection in connections obj 

    socket.on('close', connectionClose);//we listen to close event to remove our connection from connection obj 

}); 
相关问题