'use strict'
var http = require('http');
var https = require('https');
var fs = require('fs');
var express= require('express');
var serveIndex=require('serve-index');
var USERCOUNT=10;
var socketIo =require('socket.io');
var log4js = require('log4js');
log4js.configure({
appenders:{
file:{
type:'file',
filename:'app.log',
layout:{
type:'pattern',
pattern:'%r %p - %m',
}
}
},
categories:{
default:{
appenders:['file'],
level:'debug'
}
}
});
var logger = log4js.getLogger();
var app=express();
app.use(serveIndex('./public'));
app.use(express.static('./public'));
var http_server=http.createServer(app);
var options={
key:fs.readFileSync('./cert/3435783_huangxiaoguo.club.key'),
cert:fs.readFileSync('./cert/3435783_huangxiaoguo.club.pem')
}
var https_server=https.createServer(options,app);
var io = socketIo.listen(https_server);
io.sockets.on('connection',(socket)=>{
logger.debug("connection");
socket.on('message', (room, data,userId)=>{
logger.debug("message data "+room+",userId: "+userId,data);
socket.to(room).emit('message', room, userId, data)
});
socket.on('webjoinback', (room,userId)=>{
logger.debug("webjoinback data "+room+",userId: "+userId);
socket.to(room).emit('webjoinback', room, userId)
});
socket.on('join',(room,userId)=>{
logger.debug("join",",room = ", room,",userId = ", userId);
socket.join(room);
var myRoom = io.sockets.adapter.rooms[room];
var users =(myRoom)?Object.keys(myRoom.sockets).length:0;
logger.debug('the number of user in room is:'+users)
if (users<USERCOUNT) {
socket.emit('joined',room,userId);
if(users>1){
socket.to(room).emit('otherjoin',room,userId);
}
}else{
socket.leave(room);
socket.emit('full',room,userId);
}
});
socket.on('leave',(room,userId)=>{
var myRoom = io.sockets.adapter.rooms[room];
var users =(myRoom)?Object.keys(myRoom.sockets).length:0;
logger.debug('the number of user in room is:'+(users-1));
socket.to(room).emit('bye',room,userId);
socket.emit('leaved',room,userId);
});
});
https_server.listen(443, '0.0.0.0');
http_server.listen(80,'0.0.0.0');
<html>
<head>
<title>WebRTC PeerConnection</title>
<style>
.video-box{
display: flex;
align-items: center;
flex-wrap: wrap;
}
.preview{
width: 375px;
height: 640px;
margin-left: 20px;
margin-bottom: 20px;
background-color: red;
}
#remotevideo,
#remotevideo1{
object-fit:fill;
width: 100%;
height: 100%;
}
#leave{
margin-top: 20px;
width: 100px;
height: 50px;
}
</style>
</head>
<body>
<div>
<div class="video-box" id="videobox">
</div>
<div>
<button id="leave" disabled>Leave</button>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
<script src="./js/moreClient1.js"></script>
</body>
</html>
'use strict'
var videobox = document.querySelector('div#videobox');
var btnLeave = document.querySelector('button#leave');
var roomid = '989898';
var userid = '00001'
var socket =null;
var state = 'init';
var pcMaps = {
};
var pcConfig={
'iceServers':[{
'urls':'turn:***.**.***.**:3478',
'credential':'*****',
'username':'******'
}]
}
function addVideo(userId){
for (var i = 0; i < videobox.children.length; i++){
if(videobox.children[i].id===userId){
return;
}
}
var div=document.createElement("div");
div.className="preview"
div.id=userId;
var video=document.createElement("video");
video.id="remotevideo"
video.autoplay="true";
div.appendChild(video);
videobox.appendChild(div);
}
function sendMessage(roomid,data,userId){
if(socket){
socket.emit('message',roomid,data,userId);
}
}
function handleAnswerError(err){
console.error('Failed to get Answer!',err);
}
function handleOfferError(err){
console.error('Failed to get Offer!',err);
}
function call(id){
if(pcMaps[id]){
var options = {
offerToReceiveAudio:1,
offerToReceiveVideo:1
}
pcMaps[id].createOffer(options)
.then((desc)=>{
pcMaps[id].setLocalDescription(desc);
sendMessage(roomid,desc,id)
})
.catch(handleOfferError);
}
}
function conn(){
socket = io.connect();
socket.on('joined',(roomid,id)=>{
state = 'joined';
btnLeave.disabled =false;
console.log("reveive joined message:state=",id);
});
socket.on('webjoinback',(roomid,id)=>{
state = 'joined';
createPeerConnection(id);
btnLeave.disabled =false;
console.log("reveive joined message:state=",id);
});
socket.on('otherjoin',(roomid,id)=>{
createPeerConnection(id);
state = 'joined_conn';
call(id);
console.log("reveive otherjoin message:state=",id);
});
socket.on('full',(roomid,id)=>{
console.log('receive full message ', roomid, id);
closePeerConnection(id);
state = 'leaved';
btnLeave.disabled = true;
console.log("reveive full message:state=",id);
alert("the room is full!");
});
socket.on('leaved',(roomid,id)=>{
state = 'leaved';
socket.disconnect();
btnLeave.disabled = true;
console.log("reveive leaved message:state=",id);
});
socket.on('bye',(roomid,id)=>{
state = 'joined_unbind';
closePeerConnection(id);
console.log("reveive bye message:state=",id);
});
socket.on('disconnect', (socket) => {
console.log('receive disconnect message!');
if(!(state === 'leaved')){
}
state = 'leaved';
});
socket.on('message'