我一直在没有运气的情况下搜索网络。我试图弄清楚如何将私人消息从一个用户发送给另一个用户。有很多片段,但我不确定客户端/服务器交互。如果我有要发送到的套接字的 ID,如何将其发送到服务器,以及如何确保服务器仅将消息发送到那个接收器套接字?
有没有人知道的教程或演练?
不需要教程。Socket.IO 常见问题解答在这方面非常简单:
socket.emit('news', { hello: 'world' });
编辑:当询问socket
以后如何获取该对象时,人们正在链接到这个问题。没有必要。当新客户端连接时,在您保存用户信息的任何对象上保存对该套接字的引用。我的评论来自下面:
在脚本顶部某处,设置一个对象来保存用户信息。
var connectedUsers = {};
在您的
.on('connection')
函数中,将该套接字添加到您的新对象中。connectedUsers[USER_NAME_HERE] = socket;
然后,您以后可以轻松地检索它。connectedUsers[USER_NAME_HERE].emit('something', 'something');
这是一个应该有帮助的代码片段:
客户端(发送消息)
socket.emit("private", { msg: chatMsg.val(), to: selected.text() });
whereto
是指要发送私人消息的 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 });
});
虽然我们在这里有很好的答案。但是,我无法很快掌握整个客户端服务器的唯一用户标识,所以我发布了这个简单的步骤,以帮助那些像我一样苦苦挣扎的人.....
在客户端,获取用户的 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);
Listen to register 在服务器端将用户的套接字注册到连接的套接字
服务端代码 用户注册
/*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);
});
这不是最好的,但是你可以从这里开始......
我能想到的最简单的方法是让所有用户使用他们的 id 或 name 作为键并将他们的套接字作为值的一部分然后当你想向他们发送消息时你拉那个套接字和发射它......像这样的东西:
users[toUser].emit('msg',"Hello, "+toUser+"!");
如果您有一个使用 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();
如果您使用上面的代码,那么已经从您的网站打开了多少标签用户并不重要。每个选项卡将连接到同一个房间。
在 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
});
您可以为 USER_A 和 USER_B 之间的消息创建一个唯一的房间,并且两个用户都必须加入这个房间。您可以使用 UUID 作为 ROOM_ID(以下示例中的“socketId”)。
io.on('connection', socket => {
socket.on('message', message => {
socket.to(message.socketId).emit('message', message);
});
socket.on('join', socketId => {
socket.join(socketId);
});
});
我让它工作的方式是引入一个“注册用户”事件。只要有注册用户,这基本上就会在客户端触发,然后甚至发出这个并传递“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)
});
服务器端:一个有消息发送,我将消息发送到的用户的 id 传递到 msg 对象中,然后发送到那个特定的房间。
// Private chat
socket.on('chat message', function (msg) {
const uidTo = msg.uidTo
socket.in(uidTo).emit('chat message', msg )
}); `
});