source

socket.io 및 node.disc를 사용하여 특정 클라이언트에 메시지를 보냅니다.

manycodes 2023. 1. 19. 21:06
반응형

socket.io 및 node.disc를 사용하여 특정 클라이언트에 메시지를 보냅니다.

저는 socket.io 및 node.debug와 함께 일하고 있는데, 지금까지는 꽤 괜찮은 것 같습니다만, 서버에서 특정 클라이언트로 메시지를 보내는 방법은 다음과 같습니다.

client.send(message, receiverSessionId)

둘 다 .send() .broadcast()방법이 제 욕구를 채워주는 것 같아요

가 가능한 해결책으로 한 것은, 그 해결방법은, 「입니다..broadcast()method " 세션Id의 배열을 두 번째 파라미터로 받아들이기 때문에 메시지를 보내고 싶은 배열을 제외한 모든 SessionId가 연결된 배열을 서버에 전달할 수 있지만 더 나은 솔루션이 있어야 한다고 생각합니다.

좋은 생각 있어요?

Ivo Wetzel의 답변은 Socket.io 0.9에서는 더 이상 유효하지 않은 것 같습니다.

, 이 에서, 「」, 「」는 가 있습니다.socket.id를 사용합니다.io.sockets.socket(savedSocketId).emit(...)이치노

클러스터화된 Node.js 서버에서 이 작업을 수행할 수 있는 방법은 다음과 같습니다.

먼저 Redis 스토어를 스토어로 설정하여 메시지가 여러 프로세스를 통과할 수 있도록 해야 합니다.

var express = require("express");
var redis = require("redis");
var sio = require("socket.io");

var client = redis.createClient()
var app = express.createServer();
var io = sio.listen(app);

io.set("store", new sio.RedisStore);


// In this example we have one master client socket 
// that receives messages from others.

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

  // Promote this socket as master
  socket.on("I'm the master", function() {

    // Save the socket id to Redis so that all processes can access it.
    client.set("mastersocket", socket.id, function(err) {
      if (err) throw err;
      console.log("Master socket is now" + socket.id);
    });
  });

  socket.on("message to master", function(msg) {

    // Fetch the socket id from Redis
    client.get("mastersocket", function(err, socketId) {
      if (err) throw err;
      io.sockets.socket(socketId).emit(msg);
    });
  });

});

클러스터링 코드는 생략했습니다.왜냐하면 더 복잡해지기 때문입니다만, 추가하는 것은 간단합니다.워커 코드에 모든 것을 추가해 주세요.더 많은 문서는 이쪽 http://nodejs.org/api/cluster.html에서 보실 수 있습니다.

각 소켓은 이름에 대한 소켓 ID를 사용하여 룸에 결합하므로, 사용자는 그냥 할 수 있습니다.

io.to('socket#id').emit('hey')

문서: http://socket.io/docs/rooms-and-namespaces/ #default-room

건배.

가장 심플하고 우아한 방법

socket.io v3.1.1에서 동작하는 것을 확인.

다음과 같이 간단합니다.

client.emit("your message");

그리고 이것이 마지막입니다.좋아요, 하지만 어떻게 작동하죠?

최소한의 작업 예

다음은 각 클라이언트가 시퀀스 번호를 포함하는 메시지를 정기적으로 수신하는 단순한 클라이언트와 서버 간의 상호 작용의 예입니다.클라이언트마다 고유한 시퀀스가 있으며, 여기서 "특정 클라이언트에 메시지를 보내야 합니다"라는 메시지가 나타납니다.

서버

server.js

const
    {Server} = require("socket.io"),
    server = new Server(8000);

let
    sequenceNumberByClient = new Map();

// event fired every time a new client connects:
server.on("connection", (socket) => {
    console.info(`Client connected [id=${socket.id}]`);
    // initialize this client's sequence number
    sequenceNumberByClient.set(socket, 1);

    // when socket disconnects, remove it from the list:
    socket.on("disconnect", () => {
        sequenceNumberByClient.delete(socket);
        console.info(`Client gone [id=${socket.id}]`);
    });
});

// sends each client its current sequence number
setInterval(() => {
    for (const [client, sequenceNumber] of sequenceNumberByClient.entries()) {
        client.emit("seq-num", sequenceNumber);
        sequenceNumberByClient.set(client, sequenceNumber + 1);
    }
}, 1000);

서버는, 포토 8000 로 착신 접속의 수신을 개시합니다.새로운 접속이 확립되는 즉시 그 클라이언트는 시퀀스 번호를 추적하는 맵에 추가됩니다.는 또, 「 하다」도 합니다.disconnectevent: 입니다.

매초마다 타이머가 발사된다.이 경우 서버는 맵을 통과하여 모든 클라이언트에 현재 시퀀스 번호를 포함한 메시지를 발송하고 그 직후에 증분합니다.그게 전부에요.쉬워요.

고객

이치노하여 '알겠습니다'를 됩니다.seq-num메시지가 도착할 때마다 콘솔에 출력됩니다.

client.js

const
    io = require("socket.io-client"),
    ioClient = io.connect("http://localhost:8000");

ioClient.on("seq-num", (msg) => console.info(msg));

예제의 실행

필요한 라이브러리를 설치합니다.

npm install socket.io@3.1.1 socket.io-client@3.1.1

서버를 실행합니다.

node server

다음을 실행하여 다른 터미널 창을 열고 원하는 수의 클라이언트를 생성합니다.

node client

여기에 풀코드가 있는 요지도 준비했습니다.

그(깜짝)를 위해서 클라이언트를 잡을 필요가 있습니다.심플한 방법을 선택할 수 있습니다.

var io = io.listen(server);
io.clients[sessionID].send()

깨질지도 이 있다io.clients될 수 위 사항을 하십시오.

직접 합니다.clientsconnection에서 합니다.disconnect청취자

더 합니다.clients[id] = {conn: clientConnect, data: {...}}할 수 있을 것 같아

사용할 수 있습니다.

//메시지를 보낸 사람-클라이언트에게만 보내기

socket.emit('message', 'check this');

//또는 송신자를 포함한 모든 청취자에게 송신할 수 있습니다.

io.emit('message', 'check this');

//송신자를 제외한 모든 청취자에게 전송

socket.broadcast.emit('message', 'this is a message');

//혹은 방으로 보낼 수도 있습니다.

socket.broadcast.to('chatroom').emit('message', 'this is the message to all');

1.0에서는 다음을 사용해야 합니다.

io.sockets.connected[socketid].emit();

서버측 nodejs 코드에서 사용하는 "io" 오브젝트 console.log()만 사용하는 경우 사용하는 버전에 관계없이 [예를 들어 io.on('connection'), function(socket) {...}) ))는 "io"는 json 객체일 뿐이며 소켓 ID와 소켓 객체가 저장되어 있는 하위 객체가 많다는 것을 알 수 있습니다.

socket.io 버전 1.3.5 btw를 사용하고 있습니다.

io 오브젝트를 보면 다음과 같은 내용이 있습니다.

 sockets:
  { name: '/',
    server: [Circular],
    sockets: [ [Object], [Object] ],
    connected:
     { B5AC9w0sYmOGWe4fAAAA: [Object],
       'hWzf97fmU-TIwwzWAAAB': [Object] },

여기서 소켓 ID "B5"를 볼 수 있습니다.AC9w0sYmOGWe4fAAAA" 등그래서 우리는 할 수 있다.

io.sockets.connected[socketid].emit();

다시 한 번 자세히 살펴보면 다음과 같은 세그먼트를 볼 수 있습니다.

 eio:
  { clients:
     { B5AC9w0sYmOGWe4fAAAA: [Object],
       'hWzf97fmU-TIwwzWAAAB': [Object] },

여기서 소켓을 가져오려면

io.eio.clients[socketid].emit();

그리고 엔진 아래에서는

engine:
 { clients:
    { B5AC9w0sYmOGWe4fAAAA: [Object],
      'hWzf97fmU-TIwwzWAAAB': [Object] },

그래서 우리는 글을 쓸 수도 있다.

io.engine.clients[socketid].emit();

그래서 우리는 위에서 말한 세 가지 방법 중 하나로 목표를 달성할 수 있을 것 같습니다.

  1. io.sockets.connected[socketid].emit(); OR
  2. io.eio.clients [ socketid . emit ( ) ; or
  3. io.engine.syslog[syslogid].syslog();

당신은 이걸 할 수 있다.

서버.

global.io=require("socket.io")(server);

io.on("connection",function(client){
    console.log("client is ",client.id);
    //This is handle by current connected client 
    client.emit('messages',{hello:'world'})
    //This is handle by every client
    io.sockets.emit("data",{data:"This is handle by every client"})
    app1.saveSession(client.id)

    client.on("disconnect",function(){
        app1.deleteSession(client.id)
        console.log("client disconnected",client.id);
    })

})

    //And this is handle by particular client 
    var socketId=req.query.id
    if(io.sockets.connected[socketId]!=null) {
        io.sockets.connected[socketId].emit('particular User', {data: "Event response by particular user "});
    }

클라이언트에서는 매우 다루기 쉽습니다.

var socket=io.connect("http://localhost:8080/")
    socket.on("messages",function(data){
        console.log("message is ",data);
        //alert(data)
    })
    socket.on("data",function(data){
        console.log("data is ",data);
        //alert(data)
    })

    socket.on("particular User",function(data){
        console.log("data from server ",data);
        //alert(data)
    })

버전 1.4.5 이후 io.to에서 올바른 프리픽스 socketId를 제공하십시오.클라이언트가 디버깅하기 위해 기록한 socketId를 사용하고 있었는데 프리픽스가 없기 때문에 알게 될 때까지 계속 검색하게 되었습니다.따라서 가지고 있는 ID가 접두사가 아닌 경우 다음과 같이 해야 합니다.

io.to('/#' + socketId).emit('myevent', {foo: 'bar'});

io.module을 클릭합니다.sockets[socket.id].v0.9에서는 sockets(...)가 동작했습니다.

또, 클라이언트의 관계도 유지할 수 있습니다.하지만 이것은 당신의 기억을 바쁘게 만든다.

빈 개체를 만들고 클라이언트를 설정합니다.

const myClientList = {};

  server.on("connection", (socket) => {
    console.info(`Client connected [id=${socket.id}]`);
     myClientList[socket.id] = socket;   
  });
  socket.on("disconnect", (socket) => {
    delete myClientList[socket.id];
  });

오브젝트에서 ID로 특정 클라이언트를 호출합니다.

myClientList[specificId].emit("blabla","somedata");

Socket.IO를 사용하면 소켓을 "네임스페이스"할 수 있습니다.이것은 본질적으로 다른 엔드포인트 또는 경로를 할당하는 것을 의미합니다.

도움이 될 수 있습니다.http://socket.io/docs/rooms-and-namespaces/

언급URL : https://stackoverflow.com/questions/4647348/send-message-to-specific-client-with-socket-io-and-node-js

반응형