나는 socket.io + node.js로 시작하고, 로컬로 메시지를 보내고 socket.broadcast.emit()
기능 을 브로드 캐스트하는 방법을 알고 있습니다 .-연결된 모든 클라이언트가 동일한 메시지를받습니다.
이제 특정 클라이언트에게 개인 메시지를 보내는 방법을 알고 싶습니다. 즉, 두 사람 (Client-To-Client 스트림) 간의 개인 채팅을위한 소켓 하나를 의미합니다. 감사.
나는 socket.io + node.js로 시작하고, 로컬로 메시지를 보내고 socket.broadcast.emit()
기능 을 브로드 캐스트하는 방법을 알고 있습니다 .-연결된 모든 클라이언트가 동일한 메시지를받습니다.
이제 특정 클라이언트에게 개인 메시지를 보내는 방법을 알고 싶습니다. 즉, 두 사람 (Client-To-Client 스트림) 간의 개인 채팅을위한 소켓 하나를 의미합니다. 감사.
답변:
사용자가 연결되면 이메일과 같이 고유해야하는 사용자 이름으로 서버에 메시지를 보내야합니다.
사용자 이름과 소켓 쌍은 다음과 같은 객체에 저장되어야합니다.
var users = {
'userA@example.com': [socket object],
'userB@example.com': [socket object],
'userC@example.com': [socket object]
}
클라이언트에서 다음 데이터를 사용하여 서버에 개체를 내 보냅니다.
{
to:[the other receiver's username as a string],
from:[the person who sent the message as string],
message:[the message to be sent as string]
}
서버에서 메시지를 수신합니다. 메시지가 수신되면 데이터를 수신자에게 내 보냅니다.
users[data.to].emit('receivedMessage', data)
클라이언트에서 'receivedMessage'라는 서버의 방출을 수신하고 데이터를 읽음으로써 누가 보낸 사람과 보낸 메시지를 처리 할 수 있습니다.
socket.io 방을 사용할 수 있습니다. 클라이언트 측에서 고유 식별자 (이메일, ID)를 사용하여 이벤트 (이 경우 "조인"은 무엇이든 가능)를 내 보냅니다.
고객 입장에서:
var socket = io.connect('http://localhost');
socket.emit('join', {email: user1@example.com});
이제 서버 측에서 해당 정보를 사용하여 해당 사용자를위한 고유 한 공간을 만듭니다.
서버 측:
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.on('join', function (data) {
socket.join(data.email); // We are using room of socket io
});
});
이제 모든 사용자가 사용자의 이메일 이름을 딴 방에 참여했습니다. 따라서 특정 사용자에게 메시지를 보내려면
서버 측:
io.sockets.in('user1@example.com').emit('new_msg', {msg: 'hello'});
클라이언트 측에서 마지막으로 할 일은 "new_msg"이벤트를 수신하는 것입니다.
고객 입장에서:
socket.on("new_msg", function(data) {
alert(data.msg);
}
나는 당신이 아이디어를 얻길 바랍니다.
socket.io-redis
.
{email: user1@example.com}
모든 연결에 대해 어떻게 다르게 만들 수 있습니까? 앱으로 이동하는 모든 클라이언트가 사용자를 갖지 user1@example.com
않을 것입니다. 어떻게 user2@example.com
연결하는 두 번째 클라이언트에 대해 사용자 를 만들어 다른 방을 가질 수 있습니까? 성가신 질문이라면 죄송합니다.
확실히 : 간단히 말해서
이것이 필요한 것입니다.
io.to(socket.id).emit("event", data);
사용자가 서버에 가입 할 때마다 ID를 포함한 소켓 세부 정보가 생성됩니다. 이것은 특정 사람들에게 메시지를 보내는 데 정말 도움이되는 ID입니다.
먼저 모든 socket.id를 배열에 저장해야합니다.
var people={};
people[name] = socket.id;
여기 이름은 수신자 이름입니다. 예:
people["ccccc"]=2387423cjhgfwerwer23;
이제 메시지를 보낼 때마다 수신자 이름과 함께 socket.id를 얻을 수 있습니다.
이를 위해 수신자 이름을 알아야합니다. 수신자 이름을 서버로 내 보내야합니다.
마지막으로 :
socket.on('chat message', function(data){
io.to(people[data.receiver]).emit('chat message', data.msg);
});
이것이 당신을 위해 잘 작동하기를 바랍니다.
행운을 빕니다!!
socket.io 방을 참조 할 수 있습니다 . 소켓을 핸드 셰이 킹하면 "user. # {userid}"와 같이 이름이 지정된 방에 그를 연결할 수 있습니다.
그런 다음 편리한 이름으로 모든 클라이언트에게 비공개 메시지를 보낼 수 있습니다. 예를 들면 다음과 같습니다.
io.sockets.in ( 'user.125'). emit ( 'new_message', {text : "Hello world"})
위의 작업에서 사용자 "125"에게 "new_message"를 보냅니다.
감사.
socket.io 방으로 더 간단하게 만들겠습니다. 서버에 가입하려면 고유 식별자가있는 서버를 요청합니다. 여기서는 이메일을 고유 식별자로 사용합니다.
클라이언트 Socket.io
socket.on('connect', function () {
socket.emit('join', {email: user@example.com});
});
사용자가 서버에 가입하면 해당 사용자를위한 방을 만듭니다.
서버 Socket.io
io.on('connection', function (socket) {
socket.on('join', function (data) {
socket.join(data.email);
});
});
이제 우리는 모두 합류 할 준비가되었습니다. to
사용자가들을 수 있도록 서버 룸 에서 무언가를 내보내 도록합니다.
서버 Socket.io
io.to('user@example.com').emit('message', {msg: 'hello world.'});
message
클라이언트 측 에서 이벤트를 듣고 주제를 마무리하십시오.
socket.on("message", function(data) {
alert(data.msg);
});
Socket.io 방의 참조