socket.io私信

Tre*_*ook 20 message node.js socket.io

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

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

Bra*_*rad 30

不需要教程.该Socket.IO常见问题是在这一个非常简单的:

socket.emit('news', { hello: 'world' });
Run Code Online (Sandbox Code Playgroud)

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

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

var connectedUsers = {};

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

  • 那是用'新闻'ID发送给用户的?"新闻","你好","世界"的功能是什么?该片段中没有含义.如何从客户端获取消息和目标用户?..."socket.emit('news',{hello:'world'});" 不是很简单.. (11认同)
  • 在某个位置的脚本顶部,设置一个对象来保存用户的信息.`var connectedUsers = {};`在`.on('connection')`函数中,将该套接字添加到新对象中.`connectedUsers [USER_NAME_HERE] = socket;`然后你可以在以后轻松找回它.`connectedUsers [USER_NAME_HERE] .emit('something','something');` (9认同)

alm*_*pal 20

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

客户端(发送消息)

socket.emit("private", { msg: chatMsg.val(), to: selected.text() });
Run Code Online (Sandbox Code Playgroud)

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

客户端(接收消息)

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

其中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 });
});
Run Code Online (Sandbox Code Playgroud)


Pet*_*ses 12

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

在客户端,获取用户 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);
Run Code Online (Sandbox Code Playgroud)

服务端的Listen to register 将用户的socket注册到连接的socket

服务端代码用户注册

/*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;
    });
});
Run Code Online (Sandbox Code Playgroud)

从客户端发送消息

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

    socket.emit('private_chat',{
        to : username,
        message : message
    });
});
Run Code Online (Sandbox Code Playgroud)

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

/*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
        });
    }

}); 
Run Code Online (Sandbox Code Playgroud)

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

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

    alert(username+': '+message);
});
Run Code Online (Sandbox Code Playgroud)

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

  • 它正在检查您的合作伙伴的节点是否仍在连接的用户池中...... (2认同)

Ali*_*_Hr 7

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

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

var socket = io('server_url');
Run Code Online (Sandbox Code Playgroud)

在服务器端创建一个事件来检测客户端连接:

io.on('connection', function (socket) {}
Run Code Online (Sandbox Code Playgroud)

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

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

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

socket.join(uid);
console.log('user ' + socket.user + ' connected \n');
Run Code Online (Sandbox Code Playgroud)

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

io.to(uid).emit();
Run Code Online (Sandbox Code Playgroud)

如果您使用上面的代码,则用户已经从您的网站打开了多少选项卡并不重要。每个选项卡将连接到同一个房间。


Mat*_*ark 6

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

users[toUser].emit('msg',"Hello, "+toUser+"!");
Run Code Online (Sandbox Code Playgroud)