是的,有办法。这是我测试过的并且有效的。您需要使用 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 服务器进行数据通信,您可以查看此示例。