我正在将socket.io与EasyRTC一起使用P2P视频聊天。https://github.com/merictaze/enlargify的工作示例
"express": "^4.15.2",
"easyrtc": "1.0.x", // easyrtc@1.0.15
"socket.io": "^1.4.5"
使用的EasyRTC逻辑在https://github.com/merictaze/enlargify/blob/master/public/public/resources/js/app.js
但是,如果我将EasyRTC版本提高到1.1,则代码停止工作。我什至尝试了Beta分支。
"express": "^4.15.2",
"easyrtc": "priologic/easyrtc#beta",
"socket.io": "^1.4.5"
我知道这没有多大帮助,因此,在进一步调查中,我发现它在此通话中失败了
easyrtc.call(self.partnerId, successCB, failureCB, acceptedCB);
失败的错误代码是
MSG_REJECT_TARGET_EASYRTCID
在服务器侧日志显示
2017-12-07T07:02:40.477Z - debug - EasyRTC: [enlargify_app][fNhseVCWzi8XXhn5] EasyRTC command received with msgType [offer] undefined
2017-12-07T07:02:40.478Z - warning - EasyRTC: Attempt to request non-existent connection key: '0xv7UpIAlVeAzEedAAAA' undefined
2017-12-07T07:02:40.479Z - warning - EasyRTC: [enlargify_app][fNhseVCWzi8XXhn5] Could not send WebRTC signal to client [0xv7UpIAlVeAzEedAAAA]. They may no longer be online. undefined
但是,在package中恢复easyrtc版本。json在此处的演示中工作http://enlargify.herokuapp.com/
由于Beta分支中的Safari支持,我想更新EasyRTC版本。我发现演示可以顺利进行。
ps。我确实更新了socket.io版本,并更新了倒未经的调用,例如
partnerSocket = io.sockets.socket(socket.partnerId);
partnerSocket.emit("disconnect_partner", socket.id);
to
io.to(socket.partnerId).emit("disconnect_partner", socket.id);
进一步的调查表明,在客户端上生成的套接字ID与服务器上的插座不同。这就是两个同行无法连接的原因。
任何想法我如何获得 easyrtc.connect 的成功函数以返回正确的套接字?
在这里回答我自己的问题,因此,如果其他人偶然发现,他们不会像我一样浪费时间。
客户端和服务器上ID差异的原因是因为在easyrtc@1.0.15版本之前,easyrtc依靠socketio的ID并将其用作EasyRTCID。这意味着可以互换引用socket.ID和EasyRTCID。这就是为什么它在旧版本中工作的原因。
如https://github.com/priologic/easyrtc/issues/185所述,他们更改了功能,并根据新模式制作了EasyRTCID。由于信号服务器(socketio)将在启动呼叫时easyrtc发出socket.id。因此,需要业务逻辑才能通过插座之间的easyrtCID通过easyrtc调用。
除了上面,我们还需要告诉EasyRTC对象使用信号服务器的套接字实例。我遵循此示例https://demo.easyrtc.com/demos/demo_instant_messaging_meldconnect.html