【问题标题】:Is it possible to update a single part of a page using Nodejs and Socket.io?是否可以使用 Nodejs 和 Socket.io 更新页面的单个部分?
【发布时间】:2011-09-08 12:59:10
【问题描述】:

我正在尝试创建一个基本的 Node 应用程序,每次客户端连接时,我都想更新页面上显示的计数器。 (我的目标是以最简单、易学的形式创建这个应用程序,以便向我的讲师演示节点)。

服务器端应用程序 sn-ps:

建立连接

var clients = 0;

io.sockets.on('connection', function (socket) {
  socket.on('connect', function () { clients += 1 });  
  socket.on('disconnect', function(){ clients -= 1 });  
});

渲染页面

app.get(navigation.chat.page, function(req, res){ 
  res.render('chat', {
    title: navigation.chat.title,
    connected: clients
  });
});

聊天页面jade模板sn-p:

  span#client_count #{connected}
  |  connected clients   

客户端 jQuery、Socket.io 和 JavaScript

var socket = io.connect('http://localhost');

$(document).ready(function(){
  socket.on('connect', socket.emit('connect'));
});

问题: 连接的客户端数量仅在页面刷新时更新。我希望异步更新号码。我对 node、socket.io 和 express 还很陌生,所以我不确定如何解决这个问题!

【问题讨论】:

    标签: javascript jquery node.js socket.io express


    【解决方案1】:

    与其在客户端递增,不如在服务器端保持计数器值,在 connection 时递增,在 disconnect io 事件时递减。然后,您可以发送更新的计数器(在值更改的相同事件处理程序中)。在客户端,使用计数器侦听事件,并在收到时替换 html 中的值。

    服务器:

    var users_count = 0;
    
    io.sockets.on('connection', function (socket) {
        //on connection, update users count
        ++users_count;
        //send it to every opened socket
        io.sockets.emit('users_count', users_count);
    
        //when this socket is closed
        socket.on('disconnect', function () {
            //user disconnected
            --users_count;
            //emit to every opened socket, so everyone has up to date data
            io.sockets.emit('users_count', users_count);
        });
    });
    

    客户:

    jQuery(function($){
        //connect to localhost
        var socket = io.connect('http://localhost');
        //handle users_count event, by updating our html
        socket.on('users_count', function(data){
            $('#client_count').text(data);
        });
    });
    

    【讨论】:

    • 我应该监听什么事件来更新客户端的计数?
    • 通过socket.io你可以使用自定义事件。
    • 嘿,它仍然不是异步的。必须刷新页面才能更新计数。
    • 好吧,我的错 - 问题不在于异步,问题在于计数仅发送一次 - 在新连接上。这就是为什么计数器仅在页面刷新时更新 - 或者实际上是在新连接时更新。我已经解决了这个问题,现在计数会在连接和断开事件时发送到所有打开的套接字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多