2

我正在尝试为连接到我的服务器的每个对等方发送特定通知。

我正在尝试以与对等客户端相同的方式发送通知,但不支持其方法。如何从服务器向特定对等方发送通知?

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

但是这样一来,通知就不会发送给对等方。有没有办法做到这一点?

4

3 回答 3

2

我没有足够的代表发表评论,但看看你正在尝试做什么,我认为你可以使用socket.io进行直接服务器到对等通信。

查看PeerJS的文档表明

为了代理连接,PeerJS 连接到 PeerServer。请注意,没有点对点数据通过服务器;服务器仅充当连接代理。

它似乎没有设置为处理与对等点的直接通信,但是 socket.io 可以。

于 2015-12-18T02:15:48.897 回答
0

是的,有可能:

peerServer.on('connection', client => {

        client.socket.on('message', data => {
                //message to filter
                console.log('from client:', data);
        });
});
于 2020-10-07T14:52:32.467 回答
0

是的,有办法。这是我测试过的并且有效的。您需要使用 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,
});

它连接到主机/端口/协议/等处的对等服务器。您指出的,它返回一个“打开”事件以指示与服务器建立了连接。它返回客户端的 ID。或上面名为 userId 的 peer.id。

您确实使用上面的代码将消息从客户端发送回服务器:

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 设置定时函数,发送事件“消息”,然后在客户端做出反应,或者从任何客户端反之。

一个完整的工作示例,包含 n 个客户端之间的数据和语音/视频媒体以及使用 socket.io 包与 nodejs 服务器和 peerjs 服务器进行数据通信,您可以查看此示例

于 2021-07-20T22:05:21.653 回答