如何使用 Peer.js 向特定对等方发送通知
How to send a notification to a specific peer using Peer.js
我正在尝试为连接到我的服务器的每个对等点发送特定通知。
我正在尝试以与对等客户端相同的方式发送通知,但不支持其方法。如何从服务器向特定的对等点发送通知?
var PeerServer = require('peer').PeerServer;
var server = new PeerServer({port: 9000, path: '/myapp'});
var connected = [];
server.on('connection', function (id) {
var idx = connected.indexOf(id); // only add id if it's not in the list yet
if (idx === -1) {connected.push(id);}
});
server.on('disconnect', function (id) {
var idx = connected.indexOf(id); // only attempt to remove id if it's in the list
if (idx !== -1) {connected.splice(idx, 1);}
});
var app = express();
var turn = {
type: 1,
selection: "NINGUNA",
timestamp: new Date().getTime()
};
app.get('/connected-people', function (req, res) {
var list = connected;
for(var i = 0; i < connected.length; i++){
var conn = server.connect(connected[i]);
console.log(connected[i]);
conn.on('open', function(){
conn.send(turn);
});
}
return res.json(connected);
});
但是这样一来,通知就不会发送给对等方了。
有办法吗?
我没有足够的代表发表评论,但看看你想做什么,我认为你可以使用 socket.io 进行直接服务器到对等通信。
查看 PeerJS 的文档表明
To broker connections, PeerJS connects to a PeerServer. Note that no peer-to-peer data goes through the server; The server acts only as a connection broker.
它似乎没有设置为处理与同行的直接通信,但是 socket.io 可以。
是的,有可能:
peerServer.on('connection', client => {
client.socket.on('message', data => {
//message to filter
console.log('from client:', data);
});
});
是的,有办法。这是我测试过的并且有效。您需要使用 socket.io 或类似的方法,这是执行所需信号的简单方法。
您可以使用广播或简单地 socket.to(room).emit 向特定的对等方或整个房间发送消息,它会将消息发送给除发起者之外的房间的所有成员。
客户端:
// Set up event listener for a peer server data connection established event
peer.on("open", (id) => {
console.log('*** "open" event received from userId: ' + id + ', occurs when connection to peer server is established');
socket.emit("join-room", ROOM_ID, id);
console.log('*** "join-room" emit for ROOM_ID: ' + ROOM_ID + ', and userId: ' + id);
});
当您创建对等实例时,例如:
// Create a new instance of the class Peer
const peer = new Peer({
host: '/',
path: '/peerjs',
debug: 2,
port: 3030,
});
它连接到 host/port/protocol/etc 上的对等服务器。您指示的,它 returns 一个 'open' 事件表明已与服务器建立连接。它 returns 客户端的 id。或 peer.id 上面命名的 userId。
您使用上面的代码将消息从客户端发送回服务器:
socket.emit("join-room", ROOM_ID, id);
console.log('*** "join-room" emit for ROOM_ID: ' + ROOM_ID + ', and userId: ' + id);
现在让服务器响应客户端的“加入房间”事件。你从服务器端做这样的事情:
io.on("connection", (socket) => {
console.log('***Server received "connection" event on socket.io interface');
socket.on("join-room", (roomId, userId) => {
console.log('*** "join-room" event received from client: ' + userId + ' in roomId: ' + roomId);
socket.join(roomId);
socket.broadcast.to(roomId).emit('user-connected', userId);
console.log('*** "user-connected" event broadcasted to roomId: ' + roomId + ' for userId: ' + userId + ' from server');
socket.on("disconnect", () => {
socket.broadcast.to(roomId).emit('user-disconnected', userId);
console.log('*** "disconnect" event broadcasted to roomId: ' + roomId + ' for userId: ' + userId + ' from server');
});
});
socket.on("connect_error", (err) => {
console.log(`connect_error due to ${err.message}`);
});
});
现在,请记住为您发送给客户端的事件设置侦听器,以便他们在事件到来时做出反应并采取一些行动,例如对用户断开连接事件采取行动我向所有人发送消息同行关于该事件,他们都通过将此处理程序合并到他们的代码中来收听:
// Set up event listener for user-disconnected event, returns userId
socket.on("user-disconnected", (userId) => {
if (peers[userId]) { // if it exists close connection
peers[userId].close();
console.log('*** "user-disconnected" event received from userId: ' + userId);
}
});
如何沟通的限制是你的想象力,你可以使用 setTimout 设置定时功能,发送事件 'messages' 然后在客户端做出反应,反之亦然。
一个完整的工作示例,其中包含 n 个客户端之间的数据和 voice/video 媒体以及使用 socket.io 包与 nodejs 服务器和 peerjs 服务器进行数据通信,您可以查看此 example。
peer.socket._socket 是 WebSocket 的一个实例,因此您可以在其上收听“消息”事件并执行您的操作。
客户代码:
peer.on('open', id => {
peer.socket._socket.addEventListener('message', message => {
const data = JSON.parse(message.data);
console.log(data);
});
服务器代码:
peerServer.on('connection', (client) => {
client.send({ hello: 'world' });
});
我正在尝试为连接到我的服务器的每个对等点发送特定通知。
我正在尝试以与对等客户端相同的方式发送通知,但不支持其方法。如何从服务器向特定的对等点发送通知?
var PeerServer = require('peer').PeerServer;
var server = new PeerServer({port: 9000, path: '/myapp'});
var connected = [];
server.on('connection', function (id) {
var idx = connected.indexOf(id); // only add id if it's not in the list yet
if (idx === -1) {connected.push(id);}
});
server.on('disconnect', function (id) {
var idx = connected.indexOf(id); // only attempt to remove id if it's in the list
if (idx !== -1) {connected.splice(idx, 1);}
});
var app = express();
var turn = {
type: 1,
selection: "NINGUNA",
timestamp: new Date().getTime()
};
app.get('/connected-people', function (req, res) {
var list = connected;
for(var i = 0; i < connected.length; i++){
var conn = server.connect(connected[i]);
console.log(connected[i]);
conn.on('open', function(){
conn.send(turn);
});
}
return res.json(connected);
});
但是这样一来,通知就不会发送给对等方了。 有办法吗?
我没有足够的代表发表评论,但看看你想做什么,我认为你可以使用 socket.io 进行直接服务器到对等通信。
查看 PeerJS 的文档表明
To broker connections, PeerJS connects to a PeerServer. Note that no peer-to-peer data goes through the server; The server acts only as a connection broker.
它似乎没有设置为处理与同行的直接通信,但是 socket.io 可以。
是的,有可能:
peerServer.on('connection', client => {
client.socket.on('message', data => {
//message to filter
console.log('from client:', data);
});
});
是的,有办法。这是我测试过的并且有效。您需要使用 socket.io 或类似的方法,这是执行所需信号的简单方法。 您可以使用广播或简单地 socket.to(room).emit 向特定的对等方或整个房间发送消息,它会将消息发送给除发起者之外的房间的所有成员。 客户端:
// Set up event listener for a peer server data connection established event
peer.on("open", (id) => {
console.log('*** "open" event received from userId: ' + id + ', occurs when connection to peer server is established');
socket.emit("join-room", ROOM_ID, id);
console.log('*** "join-room" emit for ROOM_ID: ' + ROOM_ID + ', and userId: ' + id);
});
当您创建对等实例时,例如:
// Create a new instance of the class Peer
const peer = new Peer({
host: '/',
path: '/peerjs',
debug: 2,
port: 3030,
});
它连接到 host/port/protocol/etc 上的对等服务器。您指示的,它 returns 一个 'open' 事件表明已与服务器建立连接。它 returns 客户端的 id。或 peer.id 上面命名的 userId。
您使用上面的代码将消息从客户端发送回服务器:
socket.emit("join-room", ROOM_ID, id);
console.log('*** "join-room" emit for ROOM_ID: ' + ROOM_ID + ', and userId: ' + id);
现在让服务器响应客户端的“加入房间”事件。你从服务器端做这样的事情:
io.on("connection", (socket) => {
console.log('***Server received "connection" event on socket.io interface');
socket.on("join-room", (roomId, userId) => {
console.log('*** "join-room" event received from client: ' + userId + ' in roomId: ' + roomId);
socket.join(roomId);
socket.broadcast.to(roomId).emit('user-connected', userId);
console.log('*** "user-connected" event broadcasted to roomId: ' + roomId + ' for userId: ' + userId + ' from server');
socket.on("disconnect", () => {
socket.broadcast.to(roomId).emit('user-disconnected', userId);
console.log('*** "disconnect" event broadcasted to roomId: ' + roomId + ' for userId: ' + userId + ' from server');
});
});
socket.on("connect_error", (err) => {
console.log(`connect_error due to ${err.message}`);
});
});
现在,请记住为您发送给客户端的事件设置侦听器,以便他们在事件到来时做出反应并采取一些行动,例如对用户断开连接事件采取行动我向所有人发送消息同行关于该事件,他们都通过将此处理程序合并到他们的代码中来收听:
// Set up event listener for user-disconnected event, returns userId
socket.on("user-disconnected", (userId) => {
if (peers[userId]) { // if it exists close connection
peers[userId].close();
console.log('*** "user-disconnected" event received from userId: ' + userId);
}
});
如何沟通的限制是你的想象力,你可以使用 setTimout 设置定时功能,发送事件 'messages' 然后在客户端做出反应,反之亦然。
一个完整的工作示例,其中包含 n 个客户端之间的数据和 voice/video 媒体以及使用 socket.io 包与 nodejs 服务器和 peerjs 服务器进行数据通信,您可以查看此 example。
peer.socket._socket 是 WebSocket 的一个实例,因此您可以在其上收听“消息”事件并执行您的操作。
客户代码:
peer.on('open', id => {
peer.socket._socket.addEventListener('message', message => {
const data = JSON.parse(message.data);
console.log(data);
});
服务器代码:
peerServer.on('connection', (client) => {
client.send({ hello: 'world' });
});