我正在尝试为连接到我的服务器的每个对等方发送特定通知。
我正在尝试以与对等客户端相同的方式发送通知,但不支持其方法。如何从服务器向特定对等方发送通知?
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);
});
但是这样,通知不会发送给对等方。 有办法吗?
答案 0 :(得分:0)
我没有足够的代表发表评论,但看看你想要做什么,我认为你可以使用socket.io进行直接的服务器对等通信。
查看PeerJS的文档会显示
为了代理连接,PeerJS连接到PeerServer。请注意,没有对等数据通过服务器;服务器仅充当连接代理。
似乎没有设置来处理与对等方的直接通信,但socket.io可以。
答案 1 :(得分:0)
是的,有可能:
peerServer.on('connection', client => {
client.socket.on('message', data => {
//message to filter
console.log('from client:', data);
});
});
答案 2 :(得分: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 服务器进行数据通信,您可以查看此 example。