实现1V1音视频实时互动直播系统 十二、第四节 实现1V1音视频实时互动信令服务器

server.js  

'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 = 3;

//socket.io
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'));

//http server
var http_server = http.createServer(app);
http_server.listen(80, '0.0.0.0');

var options = {
	key : fs.readFileSync('./cert/1557605_您自己的.key'),
	cert: fs.readFileSync('./cert/1557605_您自己的.pem')
}

//https server
var https_server = https.createServer(options, app);

//bind socket.io with https_server
var io = socketIo.listen(https_server);
var sockio = socketIo.listen(http_server);

//connection 1、有一个连接来了
io.sockets.on('connection', (socket)=>{

	// 2、 给房间内的其他人进行消息转发
	socket.on('message', (room, data)=>{
		socket.to(room).emit('message', room, data)//房间内所有人,除自己外
	});
	// 3、
	//该函数应该加锁
	socket.on('join', (room)=> {
		// 4、调用socket.join将这个用户加入到这个房间
		socket.join(room);
		// 5、socket.io 本身就支持room的概念, 拿到这个房间
		var myRoom = io.sockets.adapter.rooms[room];
		// 6、看看这个房间已经有多少人了
		var users = (myRoom) ? Object.keys(myRoom.sockets).length : 0;
		logger.log('the number of user in room is: ' + users);
		//在这里可以控制进入房间的人数,现在是1V1那么一个房间最多 2个人
		//为了便于客户端控制,如果是多人的话,应该将目前房间里
		//人的个数当做数据下发下去。
		if(users < USERCOUNT) { // USERCOUNT是常量3,  如果users<3;
			socket.emit('joined', room, socket.id); // 发给除自己之外的房间的所有人,两个人的话也就是对方,告诉他我已经进入房间了
			if (users > 1) { // 如果你是第一个人,那我只发一个joined, 如果你不是房间的第一个人,那说明房间里已经有另外一个人了
				socket.to(room).emit('otherjoin', room);//emit除自己之外 那么要给另外一个人发生otherjoin,让它知道有其他人进来了
			}
		}else { // 超过2个人的话
			socket.leave(room); // 让此人离开房间
			socket.emit('full', room, socket.id);	 // 告诉它房间已满
		}
	 	// socket.to(room).emit('joined', room, socket.id);//除自己之外
		//io.in(room).emit('joined', room, socket.id)//房间内所有人
	 	//socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点	
	});
	// 4、离开
	socket.on('leave', (room)=> {
		var myRoom = io.sockets.adapter.rooms[room];
		var users = (myRoom) ? Object.keys(myRoom.sockets).length : 0;
		//users - 1;
		logger.log('the number of user in room is: ' + (users-1));

		// socket.leave(room);
		socket.to(room).emit('bye', room, socket.id)// 给房间内所有人(除自己外)发生bye
	 	socket.emit('leaved', room, socket.id);	// 给自己发送leaved
	 	//socket.to(room).emit('joined', room, socket.id);//除自己之外
		//io.in(room).emit('joined', room, socket.id)//房间内所有人
	 	//socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点	
	});

});

//connection
sockio.sockets.on('connection', (socket)=>{

	socket.on('message', (room, data)=>{
		sockio.in(room).emit('message', room, socket.id, data)//房间内所有人
	});

	socket.on('join', (room)=> {
		socket.join(room);
		var myRoom = sockio.sockets.adapter.rooms[room];
		var users = Object.keys(myRoom.sockets).length;
		logger.log('the number of user in room is: ' + users);
	 	socket.emit('joined', room, socket.id);	
	 	//socket.to(room).emit('joined', room, socket.id);//除自己之外
		//io.in(room).emit('joined', room, socket.id)//房间内所有人
	 	//socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点	
	});

	socket.on('leave', (room)=> {
		var myRoom = sockio.sockets.adapter.rooms[room];
		var users = Object.keys(myRoom.sockets).length;
		//users - 1;

		logger.log('the number of user in room is: ' + (users-1));

		socket.leave(room);
	 	socket.emit('leaved', room, socket.id);	
	 	//socket.to(room).emit('joined', room, socket.id);//除自己之外
		//io.in(room).emit('joined', room, socket.id)//房间内所有人
	 	//socket.broadcast.emit('joined', room, socket.id);//除自己,全部站点	
	});
});

https_server.listen(443, '0.0.0.0');




 

你可能感兴趣的:(WEBRTC相关)