通过WebRtc搭建了自己的网站,实现了如下功能:
相应源码可点击相应功能查看。
附上server.js源码,任何一个功能都要搭配server.js使用才能实现。
"use strict"
var http = require("http")
var https = require("https")
var fs = require("fs")
var express = require("express")
var serverIndex = require("serve-index")
var log4js = require("log4js")
var socketIo = require("socket.io")
var sqlite3 = require("sqlite3") ;
var logger = log4js.getLogger()
logger.level = "info";
var app = express();
app.use(serverIndex("./www"));
app.use(express.static("./www"));
var httpServer = http.createServer(app)
.listen(8888,"0.0.0.0");
var options = {
key:fs.readFileSync("./cert/ssl_server.key"),
cert:fs.readFileSync("./cert/ssl_server.pem")
};
var httpsServer = https.createServer(options, app)
.listen(443, "0.0.0.0");
var io = socketIo.listen(httpsServer);
io.sockets.on("connection", (socket)=>{
logger.info("connect:"+socket.id);
//监听各种信号
socket.on("login",(uname, pwd)=>{
db.all("select id from users where name = ? and pwd = ?",
[uname, pwd], (e, rows)=>{
if (e) {
logger.info(e);
socket.emit("servererr"); //告诉客户端服务出错err
} else {
if (rows.length === 1) {
socket.emit("loginsuc", uname);
} else {
socket.emit("loginerr");
}
}
});
});
socket.on("regist", (uname, pwd)=>{
db.all("select id from users where name = ?",
uname, (e,rows)=>{
if (e) {
logger.info(e);
socket.emit("servererr");
} else {
if (rows.length === 1) {
socket.emit("samename");
} else {
//插入
db.run("insert into users(name, pwd) values(?,?)",
[uname, pwd], (e)=>{
if (e) {
logger.info(e);
socket.emit("servererr");//服务器背锅
} else {
socket.emit("registok", uname);
}
});
}
}
});
});
socket.on("cjoin", (room, uname)=>{
logger.info("cjoin:", room, uname);
socket.join(room);
var myRoom = io.sockets.adapter.rooms[room];
var users = Object.keys(myRoom.sockets).length;
logger.info("房间中有:"+users+"人");
socket.emit("cjoinsuc", room, users);
socket.to(room).emit("cotherjoined", room, uname, users);
});
socket.on("cexit", (room, uname)=>{
var myRoom = io.sockets.adapter.rooms[room];
var users = Object.keys(myRoom.sockets).length - 1;
socket.leave(room);
socket.emit("cexited");
socket.to(room).emit("cotherexited", uname, users);
});
socket.on("cmsg", (room, uname, msg)=>{
io.in(room).emit("cgetmsg", uname, msg);
});
socket.on("vjoin",(room, uname)=>{
logger.info("vjoin", room, uname);
socket.join(room);
var myRoom = io.sockets.adapter.rooms[room];
var users = Object.keys(myRoom.sockets).length;
if (users > 2) {
socket.leave(room);
socket.emit("vfull", room);
} else {
socket.emit("vjoined", room);
if (users > 1) {
socket.to(room).emit("votherjoined", room, uname);
}
if (users < 1) {
socket.to(room).emit("votherjoined", uname);
}
}
});
socket.on("vleave", (room, uname)=>{
try{
var myRoom = io.sockets.adapter.rooms[room];
var users = Object.keys(myRoom.sockets).length - 1;
} catch (e) {
logger.info(e);
return;
}
socket.leave(room);
logger.info("vleave users = " + users);
socket.emit("vleaved", room);
socket.to(room).emit("votherleaved", room, uname);
});
socket.on("vdata", (room, data)=>{
socket.to(room).emit("vgetdata", room, data);
logger.info("vdata", room, data);
});
});
//数据库操作
//创建数据库
var db = null;
var sql = "";
db = new sqlite3.Database("app.db",(e)=>{
if(e)
logger.info(e);
else
logger.info("SUC");
});
//建表
//db.run("create table if not exists");
db.run("create table if not exists users(id integer primary key autoincrement, "
+"name char(50) unique, pwd char(200))",(e)=>{
if(e)
logger.info(e);
else
logger.info("create table successfully");
});
//插入数据
// sql = "insert into users(name, pwd) values('gyf','123')";
// db.exec(sql,(e)=>{
// if(e)
// logger.info(e);
// else
// logger.info("insert users into successfully");
// })
//查询
//sql = "select * from users";
sql = "select id, name, pwd from users";
db.all(sql, (e, rows)=>{
if(e)
logger.info(e);
else {
logger.info(rows);
logger.info(rows[0]);
logger.info(rows[1]);
logger.info(rows[1]["id"]);
logger.info(rows[1]["name"]);
logger.info(rows[1]["pwd"]);
}
})