socket.io私信

时间:2012-07-06 04:48:03

标签: node.js socket.io message

我在网上淘网没有运气。我想弄清楚如何从一个用户发送私人消息到另一个用户。有很多片段,但我不确定客户端/服务器的交互。如果我有要发送的套接字的ID,如何将其发送到服务器,如何确保服务器只将消息发送到那个接收器套接字?

是否有人知道的教程或演练?

8 个答案:

答案 0 :(得分:30)

无需教程。 Socket.IO FAQ在这个问题上非常简单:

socket.emit('news', { hello: 'world' });

编辑:当询问如何稍后获取socket对象时,人们会链接到此问题。没有必要。当新客户端连接时,在您保存用户信息的任何对象上保存对该套接字的引用。我的评论如下:

  

在某个位置的脚本顶部,设置一个对象来保存用户的信息。

     

var connectedUsers = {};

     

.on('connection')函数中,将该套接字添加到新对象中。 connectedUsers[USER_NAME_HERE] = socket;然后您可以在以后轻松检索它。 connectedUsers[USER_NAME_HERE].emit('something', 'something');

答案 1 :(得分:20)

这是一个应该有用的代码段:

客户端(发送消息)

socket.emit("private", { msg: chatMsg.val(), to: selected.text() });

其中to是指发送私信的ID,msg是内容。

客户端(接收消息)

socket.on("private", function(data) {   
   chatLog.append('<li class="private"><em><strong>'+ data.from +' -> '+ data.to +'</strong>: '+ data.msg +'</em></li>');
});

其中chatLog是显示聊天消息的div。

服务器侧

client.on("private", function(data) {       
    io.sockets.sockets[data.to].emit("private", { from: client.id, to: data.to, msg: data.msg });
    client.emit("private", { from: client.id, to: data.to, msg: data.msg });
});

答案 2 :(得分:6)

我能想到的最简单的方法是让所有用户使用他们的id或名称作为密钥并将他们的套接字作为值的一部分,然后当你想向他们发送消息时套接字并在其上发出......类似这样:

users[toUser].emit('msg',"Hello, "+toUser+"!");

答案 3 :(得分:3)

尽管我们在这里有很好的答案。但是,我无法很快掌握整个客户端服务器的唯一用户标识,因此,我发布了这些简单步骤,以帮助那些像我一样挣扎的人.....

在客户端,获取用户ID,就我而言,我正在获取用户名...

客户端用户注册

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

//Collect User identity from the client side
var username = prompt('Enter your Username');
socket.emit('register',username);

在服务器端侦听注册以将用户的套接字注册到连接的套接字

服务方代码用户注册

/*Craete an empty object to collect connected users*/
var connectedUsers = {};

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

/*Register connected user*/
    socket.on('register',function(username){
        socket.username = username;
        connectedUsers[username] = socket;
    });
});

从客户端发送消息

$(document).on('click','.username',function(){
    var username = $(this).text(),
        message = prompt("type your message");

    socket.emit('private_chat',{
        to : username,
        message : message
    });
});

在服务器上接收消息并将其发送给私人用户

/*Private chat*/
socket.on('private_chat',function(data){
    const to = data.to,
            message = data.message;

    if(connectedUsers.hasOwnProperty(to)){
        connectedUsers[to].emit('private_chat',{
            //The sender's username
            username : socket.username,

            //Message sent to receiver
            message : message
        });
    }

}); 

在客户端上接收消息并显示

/*Received private messages*/
socket.on('private_chat',function(data){
    var username = data.username;
    var message = data.message;

    alert(username+': '+message);
});

这不是最好的,但是您可以从这里开始。...

答案 4 :(得分:1)

在socket.io 1.0中使用

io.sockets.connected[<socketid>]

你可以只存储套接字ID。像这样:

var users = {};
users[USER_NAME] = socket.id;

然后:

io.sockets.connected[users[USER_NAME]]
   .emit('private', {
       msg:'private message for user with name '+ USER_NAME
   });

答案 5 :(得分:1)

如果您的网站注册用户使用uid,那么您可以为每个用户创建一个房间,并通过用户的uid为该房间命名。

首先使用以下方法将客户端连接到服务器:

var socket = io('server_url');
服务器端的

创建一个用于检测客户端连接的事件:

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

然后你可以使用socket.emit();向其中的客户端发出内容并询问当前用户的uid。

客户端的

为此请求创建一个事件,然后将用户的uid发送到服务器。

现在在服务器端使用以下方法将连接的套接字连接到房间:

socket.join(uid);
console.log('user ' + socket.user + ' connected \n');

现在您可以使用以下行向用户发送私人消息:

io.to(uid).emit();

如果您使用上面的代码,那么从您的网站上打开了多少个标签用户并不重要。每个标签将连接到同一个房间。

答案 6 :(得分:0)

您可以创建一个唯一的聊天室,用于USER_A和USER_B之间的消息传递,并且两个用户都必须加入此聊天室。您可以将UUID用作ROOM_ID(在以下示例中为“ socketId”)。

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 1.6

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Wipeout viewer")

    menuBar: MenuBar {
        Menu {
            title: qsTr("&File")
            MenuItem {
                text: qsTr("&Quit")
                onTriggered: Qt.quit()
            }
        }
        Menu {
            title: qsTr("&Language")
            MenuItem {
                text: qsTr("&English")
                onTriggered: translator.setLanguage("en")
            }
            MenuItem {
                text: qsTr("&French")
                onTriggered: translator.setLanguage("fr")
            }
        }
        Menu {
            title: qsTr("&Help")
            MenuItem {
                text: qsTr("&About")
            }
        }
    }
}

请参见Joining RoomsEmit Cheatsheet

答案 7 :(得分:0)

使它工作的方法是引入一个事件“注册用户”。这基本上是在有注册用户后立即在客户端触发,然后发出此偶数并传递“ currentUser._id”

Client Side: 

var socket = io();
<% if (currentUser) { %>
socket.emit('registered user', "<%= currentUser._id %>");       
<%  } %>

服务器端:“注册用户”甚至触发后,它会将当前用户套接字以该用户ID的名称连接到新会议室。因此,基本上每个注册用户都将在其uid的房间内。

socket.on('registered user', function (uid) {
socket.join(uid)
});

服务器端:有一个已发送消息,我在msg对象中传递要发送消息的用户的ID,然后发送到该特定房间。

// Private chat
socket.on('chat message', function (msg) {
const uidTo = msg.uidTo 
socket.in(uidTo).emit('chat message', msg )
}); `
});