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');