【问题标题】:Socket.io add two clients to roomSocket.io 将两个客户端添加到房间
【发布时间】:2012-05-31 14:50:22
【问题描述】:

我正在尝试在使用 express 3 和 socket.io 创建的应用程序中实现私人消息传递

当客户端使用客户端用户 ID 连接房间时,系统会自动创建并加入。这主要用于通知之类的东西。现在,我也尝试将这项功能用于私人聊天。当用户单击发送按钮时,消息将与发送者的用户 ID(来自会话用户 ID)和从隐藏字段或属性中获取的所有者的用户 ID 一起发送的元素。发件人使用所有者用户 ID 命名空间加入房间。这样做的问题是,当发件人转到另一个页面或刷新浏览器时,他会与房间断开连接,并且不会收到来自所有者的任何进一步消息。他必须发送一条新消息才能重新加入主人房间。现在我如何感知与主人房间的连接?还是我做错了?有没有更好或标准的方法来实现这一点?

服务器:

io.on('connection', function (socket) {
    var sh = socket.handshake;

    socket.join(sh.session.userid);

    socket.on('chat', function (data) {
        if (data.user) {
            socket.join(data.owner);
        }
        io.sockets.in(data.owner).emit('chat',
            {user: sh.session.user, message: data.message});
    });
});

客户:

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

$('#send_message').click(function (e) {
    socket.emit('chat',{message: $('.message').val(),
         user:$('#user'), owner:$('#owner')} //Get this from hidden fields in chat form );
    e.preventDefault();
});

socket.on('chat', function (data) {
    $('ol').prepend('<li>' + data.user + '<br />' + data.message + '</li>');
});

【问题讨论】:

  • 客户端默认不重连服务器?最初登录网站和刷新网站有什么不同?两次执行相同的代码,对吗?

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


【解决方案1】:

没错。因为当您重新加载页面时,服务器会收到“客户端断开连接”消息并取消订阅套接字。客户将需要重新发送“聊天”消息(具有相同的所有者 ID)才能返回私人订阅源。

一种方法是让客户端将所有者 ID 保存在 cookie 中,并在每次页面加载时调用它。或者,您可以让服务器存储并使用会话 cookie (http://www.senchalabs.org/connect/session.html) 调用此信息,这在本质上与第一个选项非常相似。

【讨论】:

  • 好的,所以我改成了 socket.join(sh.session.rooms);并设置会话数据室 = data.owner。然后您可以将用户连接到的所有房间添加到对象或其他东西中。谢谢
猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 2015-05-29
  • 2015-01-05
  • 2018-01-09
  • 2014-08-26
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
相关资源
最近更新 更多