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 로 착신 접속의 수신을 개시합니다.새로운 접속이 확립되는 즉시 그 클라이언트는 시퀀스 번호를 추적하는 맵에 추가됩니다.는 또, 「 하다」도 합니다.disconnect
event: 입니다.
매초마다 타이머가 발사된다.이 경우 서버는 맵을 통과하여 모든 클라이언트에 현재 시퀀스 번호를 포함한 메시지를 발송하고 그 직후에 증분합니다.그게 전부에요.쉬워요.
고객
이치노하여 '알겠습니다'를 됩니다.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
될 수 위 사항을 하십시오.
직접 합니다.clients
의 connection
에서 합니다.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();
그래서 우리는 위에서 말한 세 가지 방법 중 하나로 목표를 달성할 수 있을 것 같습니다.
- io.sockets.connected[socketid].emit(); OR
- io.eio.clients [ socketid . emit ( ) ; or
- 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
'source' 카테고리의 다른 글
팬더 DataFrame의 컬럼을 여러 줄로 네스트(폭발)하는 방법 (0) | 2023.01.19 |
---|---|
숫자에 st, nd, rd 및 th(일반) 접미사를 추가합니다. (0) | 2023.01.19 |
Vue 3에서 Vuex 4용 Web 소켓 플러그인 구현(소켓 라이브러리에 의존하지 않음) (0) | 2023.01.19 |
JSON 키 이름에 유효한 문자와 유효하지 않은 문자는 무엇입니까? (0) | 2023.01.19 |
CLI를 사용하여 Wildfly에서 MariaDB 데이터 소스를 설정하는 방법 (0) | 2023.01.19 |