我正在尝试使用peerjs制作视频聊天应用程序,但问题是未建立两个用户之间的连接

问题描述

下面是服务器端的代码

const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const { v4: uuidV4} = require('uuid');

app.set('view engine','ejs');
app.use(express.static('public'));

app.get('/',(req,res)=>{
    res.redirect(`/${uuidV4()}`);
});

app.get('/:room',res)=>{
    console.log(req.params);
    res.render('room',{roomId: req.params.room});
})

io.on('connection',socket =>{
    socket.on('join-room',(roomId,userId)=>{
        socket.join(roomId);
        socket.to(roomId).broadcast.emit('user-connected',userId)
    })
})

server.listen(3000)

现在,客户端javascript代码

const socket = io('/')
const videoGrid = document.getElementById('video-grid')
const myPeer = new Peer(undefined,{
  host: '/',port: '3001'
})
const myVideo = document.createElement('video')
myVideo.muted = true
const peers = {}
navigator.mediaDevices.getUserMedia({
video: true,audio: true
}).then(stream => {
    addVideoStream(myVideo,stream)

    myPeer.on('call',call => {
        call.answer(stream)
        const video = document.createElement('video')
        call.on('stream',userVideoStream => {
            addVideoStream(video,userVideoStream)
        })
    })
    socket.on('user-connected',userId => {
       connectToNewUser(userId,stream)
   })
})

socket.on('user-disconnected',userId => {
    if (peers[userId]) peers[userId].close()
})

myPeer.on('open',id => {
   socket.emit('join-room',ROOM_ID,id)
})

function connectToNewUser(userId,stream) {
    const call = myPeer.call(userId,stream)
    const video = document.createElement('video')
    call.on('stream',userVideoStream => {
        addVideoStream(video,userVideoStream)
    })
    call.on('close',() => {
        video.remove()
    })

   peers[userId] = call
}

function addVideoStream(video,stream) {
   video.srcObject = stream
   video.addEventListener('loadedMetadata',() => {
       video.play()
   })
   videoGrid.append(video)
}

此后,我无法在两个用户之间建立连接。 我正在使用peerjs库连接电话 服务器在端口3000上运行 而对等节点的运行速度为3001

我正在跟踪一个来自youTube频道webdevsimplified的视频 https://www.youtube.com/watch?v=DvlyzDZDEq4

解决方法

我在 socket.emit 的第 22 行删除了“broadcast”

io.on('connection',socket =>{
    socket.on('join-room',(roomId,userId)=>{
        socket.join(roomId);
        socket.to(roomId).emit('user-connected',userId) //here
    })
})

然后我在第二个终端运行

peerjs --port 3001
,它工作正常:)

p.s 我的 socket.io 版本在服务器端是“^4.0.0”

,

在一个终端上尝试peerjs --port 3001,然后在另一个终端上启动服务器。如果不是这种情况,请详细说明正在发生的事情。

,

我认为您可以删除 Peer 配置,因此它只是 const myPeer = new Peer()

它不喜欢new Peer(undefined)