Nodejs,客户端并不总是接收服务器消息

我正在设置一个非常基本的节点应用程序,计划是任何人都可以在网站上按一个字母,这将增加一个计数器。 然后每个人都可以看到,随着世界各地的人们正在增加计数器,计数器正在上升。 除了我在开始时设置的方式,节点服务器每秒连接每个客户端20次,这是非常浪费的。

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

这是我的第一个节点应用程序,我仍然得到它的窍门,有谁可以指出我在这个方向正确的方向吗? 问题可能在于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}); }); 

问题是你没有存储你的连接,当你用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 });