태그 보관물: socket.io

socket.io

socket.io를 사용하여 특정 클라이언트에 메시지를 보내는 방법 있습니다 .-연결된 모든 클라이언트가

나는 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);
}

나는 당신이 아이디어를 얻길 바랍니다.


답변

확실히 :
간단히 말해서

이것이 필요한 것입니다.

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”를 보냅니다.

감사.


답변

우리 회사의 프로젝트에서 우리는 “rooms”접근 방식을 사용하고 있으며 그 이름은 대화에있는 모든 사용자의 사용자 ID를 고유 식별자로 조합 한 것입니다 (우리의 구현은 페이스 북 메신저와 비슷합니다). 예 :

| id | 이름 | 1 | 스콧 | 2 | 수잔

“room”이름은 “1-2″(ID는 Asc로 정렬 됨)이며 연결이 끊기면 socket.io가 자동으로 방을 정리합니다.

이렇게하면 해당 룸에만 메시지를 보내고 온라인 (연결된) 사용자에게만 메시지를 보냅니다 (서버 전체에 패키지가 더 적게 전송 됨).


답변

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 방의 참조


답변