const startButton = document.getElementById('startButton');
const localVideo = document.getElementById('localVideo');
const remoteVideo = document.getElementById('remoteVideo');

let pc;
let localStream;

const signaling = new WebSocket('ws://127.0.0.1:3333/ws/chat');
signaling.onmessage= e => {
console.log(e.data)
var msg=JSON.parse(e.data);
  switch (msg.type) {
    case 'offer':
      handleOffer(msg);
      break;
    case 'answer':
      pc.setRemoteDescription(msg);
      break;
    case 'candidate':
      pc.addIceCandidate(msg.candidate);
      break;    
  }
}

//navigator.mediaDevices.getUserMedia({audio: true, video: true}).then(loStream=>{localStream=loStream;localVideo.srcObject = loStream});

startButton.onclick = async function getmedia() {  
  makeCall();
};

//ubuntu搭建简易stun服务器只需要两个命令:sudo apt install stun-server;stund  -h 127.0.0.1默认端口3478,软件只有几十kb
let serverConfig = {
        "iceServers": [
            { "urls": "stun:xxx.xxx.net:3478"       
            }
        ]
    };

function createPeerConnection() {
  pc = new RTCPeerConnection(serverConfig);
  pc.onicecandidate = e => { signaling.send(JSON.stringify({type: 'candidate',candidate:e.candidate}));}
  
  //pc.ontrack = e => remoteVideo.srcObject = e.streams[0];
  //localStream.getTracks().forEach(track => pc.addTrack(track, localStream));
}

async function makeCall() {
  await createPeerConnection();
  sendChannel=pc.createDataChannel('sendDataChannel');
  sendChannel.addEventListener('open', onopen);
  const offer = await pc.createOffer();
  signaling.send(JSON.stringify({type: 'offer',sdp: offer.sdp}));
  await pc.setLocalDescription(offer);
}

async function handleOffer(offer) {   
  await createPeerConnection();
  await pc.setRemoteDescription(offer);
  const answer = await pc.createAnswer();
  signaling.send(JSON.stringify({type: 'answer', sdp: answer.sdp}));
  await pc.setLocalDescription(answer);
  pc.addEventListener('datachannel', event=> event.channel.onmessage = onReceiveMessageCallback);
}

function onopen(){
console.log("发送")
sendChannel.send("发送的数据")
}

function onReceiveMessageCallback(event) {
console.log(event.data)
}

node服务端websocket转发控制消息:

const WebSocket = require('ws');

let wss = new WebSocket.Server({port: 3333});    
    
var t=0,a,b;

wss.on('connection', function (ws) {
    if (t===0){
	     a=ws
	     t=1
	     console.log("a")
     }
    else {
	    b=ws
	    t=0
	    console.log("b")
    }
    ws.on('message', onMessage);   
})
    
function onMessage(msg){
	//console.log(msg)
    try {
	if(this==a)
		b.send(msg)
	else
		a.send(msg)
	}
    catch(e){}
}

ubuntu搭建简易stun服务器只需要两个命令:sudo apt install stun-server;stund  -h 127.0.0.1默认端口3478,软件只有几十kb

本测试可以通过p2p传输数据,没有测试turn。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐