添加心跳包检测
This commit is contained in:
1 parent
127f58bd36
commit
ec5fcf1ee7
5 files changed
+149
-67
No files matched your search
@@ -4,6 +4,7 @@ import Database from "better-sqlite3";
|
||||
import fs from "fs";
|
||||
import { WebSocketServer } from "ws";
|
||||
import http from "http";
|
||||
import { v4 as uuid4 } from "uuid";
|
||||
// import Config from "./miaoShareConfig.json"
|
||||
|
||||
const HOST = "0.0.0.0";
|
||||
@@ -122,9 +123,9 @@ function generateId(isGID) {
|
||||
charStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
|
||||
for (var i = 0; i < range; i++) {
|
||||
if(isGID === true && i == 0){
|
||||
if (isGID === true && i == 0) {
|
||||
var index = parseInt(Math.random() * 26);
|
||||
}else{
|
||||
} else {
|
||||
var index = parseInt(Math.random() * 36);
|
||||
}
|
||||
returnStr += charStr.substring(index, index + 1);
|
||||
@@ -232,19 +233,20 @@ const groupsMap = {};
|
||||
// 三天不活跃的群组将被清除
|
||||
const LifeOfGroup = millisecondsOfOneDay * 3;
|
||||
// const LifeOfGroup = 0;
|
||||
|
||||
// 根据uuid查询加入的群组
|
||||
const uuid2Groups={}
|
||||
|
||||
db.exec(
|
||||
`CREATE TABLE IF NOT EXISTS GROUPS (
|
||||
gID CHAR(8) PRIMARY KEY UNIQUE NOT NULL,
|
||||
verify TEXT NOT NULL,
|
||||
activeTimestamp INT NOT NULL
|
||||
);`)
|
||||
|
||||
);`
|
||||
);
|
||||
|
||||
const stmt_getExpiredGroups = db.prepare(`SELECT gID FROM GROUPS WHERE activeTimestamp < ? `);
|
||||
|
||||
const stmt_getGroupVerify = db.prepare(`SELECT verify FROM GROUPS WHERE gID = ? `)
|
||||
const stmt_getGroupVerify = db.prepare(`SELECT verify FROM GROUPS WHERE gID = ? `);
|
||||
|
||||
const stmt_insertGROUPS = db.prepare(`INSERT INTO GROUPS (gID,verify, activeTimestamp) VALUES (?, ?, ?)`);
|
||||
|
||||
@@ -252,98 +254,113 @@ const stmt_updateGROUPS_ActiveTimestamp = db.prepare(`UPDATE GROUPS SET activeTi
|
||||
|
||||
const stmt_deleteGroup = db.prepare(`DELETE FROM GROUPS WHERE gID=?`);
|
||||
|
||||
const generateStmt_insertMessage_map = {}
|
||||
|
||||
const generateStmt_insertMessage_map = {};
|
||||
|
||||
const updateGROUPS = () => {
|
||||
// console.log(1)
|
||||
try {
|
||||
let gIDs = stmt_getExpiredGroups.all(parseInt(Date.now()) - LifeOfGroup);
|
||||
for (let row of gIDs) {
|
||||
let gID = row.gID
|
||||
db.exec(`DROP TABLE IF EXISTS ${gID}`)
|
||||
stmt_deleteGroup.run(gID)
|
||||
let gID = row.gID;
|
||||
db.exec(`DROP TABLE IF EXISTS ${gID}`);
|
||||
stmt_deleteGroup.run(gID);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
return;
|
||||
}
|
||||
};
|
||||
updateGROUPS()
|
||||
setInterval(updateGROUPS,1000*3600*3)
|
||||
updateGROUPS();
|
||||
setInterval(updateGROUPS, 1000 * 3600 * 3);
|
||||
|
||||
// 创建群组的数据库
|
||||
function createGroupTableDB(gID,verify){
|
||||
function createGroupTableDB(gID, verify) {
|
||||
db.exec(
|
||||
`CREATE TABLE IF NOT EXISTS ${gID} (
|
||||
message TEXT NOT NULL,
|
||||
type TEXT NOT NULL,
|
||||
sender TEXT NOT NULL,
|
||||
timestamp INT NOT NULL
|
||||
);`)
|
||||
stmt_insertGROUPS.run(gID,verify,parseInt(Date.now()))
|
||||
);`
|
||||
);
|
||||
stmt_insertGROUPS.run(gID, verify, parseInt(Date.now()));
|
||||
}
|
||||
|
||||
// 插入信息
|
||||
function insertMessageByGID(gID,msg,sender){
|
||||
if(!generateStmt_insertMessage_map[gID]){
|
||||
function insertMessageByGID(gID, msg, from) {
|
||||
if (!generateStmt_insertMessage_map[gID]) {
|
||||
generateStmt_insertMessage_map[gID] = db.prepare(`INSERT INTO ${gID} (message,type,sender, timestamp) VALUES (?, ?, ?, ?)`);
|
||||
}
|
||||
generateStmt_insertMessage_map[gID].run(msg,'gMsg',sender,parseInt(Date.now()))
|
||||
generateStmt_insertMessage_map[gID].run(msg, "gMsg", from, parseInt(Date.now()));
|
||||
}
|
||||
|
||||
function updateActiveTimestamp(gID){
|
||||
stmt_updateGROUPS_ActiveTimestamp.run(parseInt(Date.now()),gID)
|
||||
function updateActiveTimestamp(gID) {
|
||||
stmt_updateGROUPS_ActiveTimestamp.run(parseInt(Date.now()), gID);
|
||||
}
|
||||
|
||||
function createGroup(verify) {
|
||||
// 暂时不考虑id随机生成时重复的问题
|
||||
let gID = generateId(true);
|
||||
groupsMap[gID] = { verify, member: [], msgHistory: [] };
|
||||
createGroupTableDB(gID,verify)
|
||||
createGroupTableDB(gID, verify);
|
||||
return gID;
|
||||
}
|
||||
|
||||
function getGroupVerify(gID) {
|
||||
if(!groupsMap[gID]){
|
||||
let verify = stmt_getGroupVerify.get(gID).verify
|
||||
// 暂时这么写
|
||||
let msgHistory = db.prepare(`SELECT message,type FROM ${gID}`).all().map(v=>{
|
||||
return {msg: v.message,type:v.type}
|
||||
})
|
||||
// console.log(msgHistory)
|
||||
groupsMap[gID] = { verify, member: [], msgHistory};
|
||||
}
|
||||
initMsgHistory(gID)
|
||||
return groupsMap[gID].verify;
|
||||
}
|
||||
|
||||
// 正式加入群组
|
||||
function joinGroup(socket, gID, callback) {
|
||||
initMsgHistory(gID)
|
||||
groupsMap[gID].member.push(socket);
|
||||
updateActiveTimestamp(gID)
|
||||
updateActiveTimestamp(gID);
|
||||
callback();
|
||||
}
|
||||
|
||||
// 暂时这么写
|
||||
function getHistory(gID) {
|
||||
initMsgHistory(gID)
|
||||
return groupsMap[gID].msgHistory;
|
||||
}
|
||||
|
||||
function broadcastMsg(gID, msg) {
|
||||
updateActiveTimestamp(gID)
|
||||
insertMessageByGID(gID,msg,'NULL')
|
||||
function broadcastMsg(gID, msg, from) {
|
||||
initMsgHistory(gID)
|
||||
updateActiveTimestamp(gID);
|
||||
insertMessageByGID(gID, msg, from);
|
||||
|
||||
let bmsg = JSON.stringify({ type: "gMsg", gID, msg })
|
||||
groupsMap[gID].msgHistory.push({ type: "gMsg", msg });
|
||||
let bmsg = JSON.stringify({ type: "gMsg", gID, msg });
|
||||
groupsMap[gID].msgHistory.push({ type: "gMsg", msg, from });
|
||||
for (let socket of groupsMap[gID].member) {
|
||||
socket.send(bmsg);
|
||||
}
|
||||
}
|
||||
|
||||
function initMsgHistory(gID){
|
||||
if (!groupsMap[gID]) {
|
||||
let verify = stmt_getGroupVerify.get(gID).verify;
|
||||
// 暂时这么写
|
||||
let msgHistory = db
|
||||
.prepare(`SELECT message,type FROM ${gID}`)
|
||||
.all()
|
||||
.map(v => {
|
||||
return { msg: v.message, type: v.type };
|
||||
});
|
||||
// console.log(msgHistory)
|
||||
groupsMap[gID] = { verify, member: [], msgHistory };
|
||||
}
|
||||
}
|
||||
|
||||
// 灵车
|
||||
wss.on("connection", socket => {
|
||||
console.log("新的连接已建立");
|
||||
const no = wss.clients.size;
|
||||
const joinedGroup = []
|
||||
const joinedGroup = [];
|
||||
var uuid = uuid4();
|
||||
function setUuid(new_uuid){
|
||||
uuid = new_uuid
|
||||
}
|
||||
socket.on("message", message => {
|
||||
try {
|
||||
console.log(message.toString());
|
||||
@@ -357,38 +374,45 @@ wss.on("connection", socket => {
|
||||
// 加入群组——客端验证key
|
||||
if (msg.type1 === "verify") {
|
||||
// 已经加入则return
|
||||
if(joinedGroup.includes(msg.gID)){
|
||||
return
|
||||
if (joinedGroup.includes(msg.gID)) {
|
||||
return;
|
||||
}
|
||||
socket.send(JSON.stringify({ type: "sMsg", type1: "joinVerify", verify: getGroupVerify(msg.gID), gID: msg.gID }));
|
||||
} else if (msg.type1 === "success") {
|
||||
if(joinedGroup.includes(msg.gID)){
|
||||
return
|
||||
if (joinedGroup.includes(msg.gID)) {
|
||||
return;
|
||||
}
|
||||
// 成功加入
|
||||
joinGroup(socket, msg.gID, () => {
|
||||
joinedGroup.push(msg.gID)
|
||||
joinedGroup.push(msg.gID);
|
||||
// 不考虑失败属于是
|
||||
socket.send(JSON.stringify({ type: "sMsg",gID:msg.gID, type1: "history", history: JSON.stringify(getHistory(msg.gID)) }));
|
||||
socket.send(JSON.stringify({ type: "sMsg", gID: msg.gID, type1: "history", history: JSON.stringify(getHistory(msg.gID)) }));
|
||||
});
|
||||
}
|
||||
} else if (type === "message") {
|
||||
let gID = msg.gID;
|
||||
broadcastMsg(gID, msg.msg);
|
||||
broadcastMsg(gID, msg.msg,uuid);
|
||||
} else if (type === "heartbeat") {
|
||||
socket.send(JSON.stringify({ type: "sMsg", type1: "heartbeat" }));
|
||||
} else if (type === "uuid") {
|
||||
if (msg.type1 === "get") {
|
||||
socket.send(JSON.stringify({ type: "sMsg", type1: "uuid", uuid }));
|
||||
} else if (msg.type1 === "set") {
|
||||
uuid = msg.uuid
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
console.log(e);
|
||||
}
|
||||
});
|
||||
|
||||
socket.on("close", () => {
|
||||
for(let gID of joinedGroup){
|
||||
groupsMap[gID].member = groupsMap[gID].member.filter(v=>v!==socket)
|
||||
for (let gID of joinedGroup) {
|
||||
groupsMap[gID].member = groupsMap[gID].member.filter(v => v !== socket);
|
||||
}
|
||||
console.log(`No.${no} exit.`);
|
||||
console.log(groupsMap)
|
||||
console.log(groupsMap);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in new issue
Block a user