From eebb74bfbd46f0fb13ec29d7a48f0fde2113e977 Mon Sep 17 00:00:00 2001 From: shihuaping Date: Mon, 14 Aug 2017 17:02:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E9=80=9A=E7=BD=91=E5=85=B3=E5=88=B0ce?= =?UTF-8?q?nter=E9=97=B4=E7=9A=84=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/vcs.xml | 6 +++ center_svr/center-handler.js | 63 ++++++++++++++++++++++ center_svr/center-server.js | 58 ++++++++++++++++++++ center_svr/center.js | 4 ++ center_svr/config/log4js.json | 25 +++++++++ center_svr/config/sys-config.json | 8 +++ center_svr/log/center.log | 35 ++++++++++++ center_svr/logger.js | 7 +++ center_svr/redis-oper.js | 90 +++++++++++++++++++++++++++++++ center_svr/short-ID.js | 13 +++++ gate_svr/register-center.js | 0 lib/const-define.js | 0 lib/rds-key.js | 0 protocol/packet.js | 0 14 files changed, 309 insertions(+) create mode 100644 .idea/vcs.xml create mode 100644 center_svr/center-handler.js create mode 100644 center_svr/center-server.js create mode 100644 center_svr/center.js create mode 100644 center_svr/config/log4js.json create mode 100644 center_svr/config/sys-config.json create mode 100644 center_svr/log/center.log create mode 100644 center_svr/logger.js create mode 100644 center_svr/redis-oper.js create mode 100644 center_svr/short-ID.js create mode 100644 gate_svr/register-center.js create mode 100644 lib/const-define.js create mode 100644 lib/rds-key.js create mode 100644 protocol/packet.js diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/center_svr/center-handler.js b/center_svr/center-handler.js new file mode 100644 index 0000000..15e0ce3 --- /dev/null +++ b/center_svr/center-handler.js @@ -0,0 +1,63 @@ + + +//------------------------------------- +// redis +// type : server1 server2 server3 +// +// +//------------------------------------- + +const rdsOper = require('./redis-oper'); +const cmdDefine = require('../protocol/cmd-define'); +const packet = require('../protocol/packet'); + +// +// { +// name +// type +// ip +// port +// ext +// } +function registerServer(serverInfo) { + + rdsOper.saveServer(serverInfo); +} + +function removeServer() { + + rdsOper.removeServer(serverInfo) +} + +async function getServer(socket, serverInfo) { + + let serverList = await rdsOper.getServerList(serverInfo.type); +} + +function process(socket, data) { + + + let jObj = JSON.parse(data); + + console.log(jObj); + + let mainCmd = jObj.head.mcmd; + let subCmd = jObj.head.scmd; + switch (subCmd) { + case cmdDefine.SUB_CENTER_UPDATE: + let serverInfo = jObj.body; + registerServer(serverInfo); + break; + case cmdDefine.SUB_CENTER_GET: + let serverList = getServer(socket, serverInfo); + let retObj = packet.getPacket(mainCmd,subCmd+100); + retObj.body = serverList; + socket.write(retObj); + break; + default: + break + } + +} + +exports.process = process; \ No newline at end of file diff --git a/center_svr/center-server.js b/center_svr/center-server.js new file mode 100644 index 0000000..316b01b --- /dev/null +++ b/center_svr/center-server.js @@ -0,0 +1,58 @@ +const net = require('net'); +const sysConfig = require('./config/sys-config.json'); +const logger = require('./logger'); +const process = require('process'); +const centerHandler = require('./center-handler'); + +const server = net.createServer(); + +//attention: +//1.to be more stable +//all request should put into a queue + +function startServer() { + + server.on('listening', function () { + logger.info("server is listening on port:%d", sysConfig.svrPort); + }); + + server.on('connection', function (socket) { + + socket.setTimeout(60 * 1000, function () { + logger.error("ip:%s,idle timeout, disconncting, bye", socket.remoteAddress); + socket.end('idle timeout, disconnecting, bye!'); + socket.destroy(); + }); + + socket.on('data', function (data) { + logger.info("ip:%s, get data", socket.remoteAddress); + console.debug(data); + centerHandler.process(socket, data); + }); + + socket.on('error', function (err) { + logger.info("ip:%s,error", socket.remoteAddress); + logger.error(err); + socket.destroy(); + }); + + socket.on('close', function (had_error) { + logger.info("ip:%s,socket closed", socket.remoteAddress); + if (!socket.destroyed) { + logger.info("destroy socket"); + socket.destroy(); + } + }) + }); + + server.on('error', (err) => { + logger.error(err); + process.exit(1); + }); + + server.listen(sysConfig.svrPort, sysConfig.svrHost, () => { + logger.info('server bound on host:%s,port:%d', sysConfig.svrHost, sysConfig.svrPort); + }); +} + +exports.startServer = startServer; \ No newline at end of file diff --git a/center_svr/center.js b/center_svr/center.js new file mode 100644 index 0000000..c81f405 --- /dev/null +++ b/center_svr/center.js @@ -0,0 +1,4 @@ + +centerServer = require('./center-server'); + +centerServer.startServer(); \ No newline at end of file diff --git a/center_svr/config/log4js.json b/center_svr/config/log4js.json new file mode 100644 index 0000000..1567c21 --- /dev/null +++ b/center_svr/config/log4js.json @@ -0,0 +1,25 @@ +{ + "appenders": { + "gatefile": { + "type": "file", + "filename": "log/center.log", + "maxLogSize": 10485760, + "numBackups": 3 + }, + "console": { + "type": "console", + "level": "debug" + } + }, + "categories": { + "default": { + "appenders": [ + "console", + "gatefile" + ], + "level": "debug" + } + } +} + + diff --git a/center_svr/config/sys-config.json b/center_svr/config/sys-config.json new file mode 100644 index 0000000..d613784 --- /dev/null +++ b/center_svr/config/sys-config.json @@ -0,0 +1,8 @@ + +{ + "svrHost":"127.0.0.1", + "svrPort":9200, + "redisHost":"127.0.0.1", + "redisPort":6379, + "redisPassword":"" +} \ No newline at end of file diff --git a/center_svr/log/center.log b/center_svr/log/center.log new file mode 100644 index 0000000..56d76bc --- /dev/null +++ b/center_svr/log/center.log @@ -0,0 +1,35 @@ +[2017-08-14 14:33:18.443] [INFO] default - server is listening on port:9200 +[2017-08-14 14:33:18.447] [INFO] default - server bound on host:127.0.0.1,port:9200 +[2017-08-14 16:03:57.593] [INFO] default - server is listening on port:9200 +[2017-08-14 16:03:57.598] [INFO] default - server bound on host:127.0.0.1,port:9200 +[2017-08-14 16:46:25.930] [INFO] default - ip:127.0.0.1, get data +[2017-08-14 16:47:21.990] [INFO] default - server is listening on port:9200 +[2017-08-14 16:47:21.994] [INFO] default - server bound on host:127.0.0.1,port:9200 +[2017-08-14 16:47:36.603] [INFO] default - ip:127.0.0.1, get data +[2017-08-14 16:48:06.344] [INFO] default - server is listening on port:9200 +[2017-08-14 16:48:06.348] [INFO] default - server bound on host:127.0.0.1,port:9200 +[2017-08-14 16:48:21.468] [INFO] default - ip:127.0.0.1, get data +[2017-08-14 16:49:32.588] [INFO] default - server is listening on port:9200 +[2017-08-14 16:49:32.592] [INFO] default - server bound on host:127.0.0.1,port:9200 +[2017-08-14 16:49:47.492] [INFO] default - ip:127.0.0.1, get data +[2017-08-14 16:51:55.449] [INFO] default - server is listening on port:9200 +[2017-08-14 16:51:55.452] [INFO] default - server bound on host:127.0.0.1,port:9200 +[2017-08-14 16:52:09.691] [INFO] default - ip:127.0.0.1, get data +[2017-08-14 16:53:04.346] [INFO] default - server is listening on port:9200 +[2017-08-14 16:53:04.349] [INFO] default - server bound on host:127.0.0.1,port:9200 +[2017-08-14 16:53:55.331] [INFO] default - ip:127.0.0.1, get data +[2017-08-14 16:54:32.299] [INFO] default - server is listening on port:9200 +[2017-08-14 16:54:32.301] [INFO] default - server bound on host:127.0.0.1,port:9200 +[2017-08-14 16:57:20.241] [INFO] default - ip:127.0.0.1, get data +[2017-08-14 16:57:20.244] [INFO] default - ip:127.0.0.1,socket closed +[2017-08-14 16:58:30.262] [INFO] default - server is listening on port:9200 +[2017-08-14 16:58:30.265] [INFO] default - server bound on host:127.0.0.1,port:9200 +[2017-08-14 16:58:50.251] [INFO] default - ip:127.0.0.1, get data +[2017-08-14 16:59:55.004] [INFO] default - server is listening on port:9200 +[2017-08-14 16:59:55.007] [INFO] default - server bound on host:127.0.0.1,port:9200 +[2017-08-14 17:00:10.251] [INFO] default - ip:127.0.0.1, get data +[2017-08-14 17:00:10.254] [INFO] default - ip:127.0.0.1,socket closed +[2017-08-14 17:00:30.253] [INFO] default - ip:127.0.0.1, get data +[2017-08-14 17:00:30.254] [INFO] default - ip:127.0.0.1,socket closed +[2017-08-14 17:00:50.256] [INFO] default - ip:127.0.0.1, get data +[2017-08-14 17:00:50.257] [INFO] default - ip:127.0.0.1,socket closed diff --git a/center_svr/logger.js b/center_svr/logger.js new file mode 100644 index 0000000..7f5e2d0 --- /dev/null +++ b/center_svr/logger.js @@ -0,0 +1,7 @@ + +const config = require('./config/log4js.json'); + +const log4js = require('log4js'); +log4js.configure(config); + +module.exports = log4js.getLogger(); \ No newline at end of file diff --git a/center_svr/redis-oper.js b/center_svr/redis-oper.js new file mode 100644 index 0000000..441a92c --- /dev/null +++ b/center_svr/redis-oper.js @@ -0,0 +1,90 @@ +const sysConfig = require('./config/sys-config.json'); +const redis = require('redis'); +const rdsKey = require('../lib/rds-key'); +const logger = require('./logger'); + +const host = sysConfig.redisHost; +const port = sysConfig.redisPort; +const password = sysConfig.redisPassword; +let rds = null; + +function getConnection() { + + if (rds) return rds; + + if (!!password && password.length > 0) { + rds = redis.createClient({host: host, port: port, password: password}); + } else { + rds = redis.createClient({host: host, port: port}); + } + return rds; +} + +getConnection(); + +function saveServer(serverInfo) { + + let keyName = rdsKey.KEY_SERVER_TYPE + serverInfo.type; + + rds.get(keyName, function (err, reply) { + if (err) { + logger.error(err); + return; + } + + jArray = JSON.parse(reply); + + if (!jArray) { + jArray = []; + } + let found = false; + for (let v of jArray) { + if (v.ip === serverInfo.ip) { + // do nothing + found = true; + break; + } + } + + if (!found) { + jArray.push(serverInfo); + let json = JSON.stringify(jArray); + rds.set(keyName, json); + } + + }); +} + +function getServerList(type) { + + return new Promise(function (resolve, reject) { + let keyName = rdsKey.KEY_SERVER_TYPE + serverInfo.type; + rds.get(keyName, function (err, reply) { + if (err) { + reject(err); + return; + } + resolve(reply); + }) + }); +} + +async function removeServer(serverInfo) { + let serverList = await getServerList(serverInfo.type); + let jArray = JSON.parse(serverList); + let idx = 0; + for (let v of jArray) { + if (v.ip === serverInfo.ip) { + delete jArray[idx]; + break; + } + idx++; + } + let keyName = rdsKey.KEY_SERVER_TYPE + serverInfo.type; + let json = JSON.stringify(jArray); + rds.set(keyName, json); +} + +exports.getServerList = getServerList; +exports.saveServer = saveServer; +exports.removeServer = removeServer; \ No newline at end of file diff --git a/center_svr/short-ID.js b/center_svr/short-ID.js new file mode 100644 index 0000000..dbff1b2 --- /dev/null +++ b/center_svr/short-ID.js @@ -0,0 +1,13 @@ + +var idx = 1024; + + function getNextID() { + if(idx > 4200000000) { + idx = 1024; + } + idx++; + return idx; +} + + +exports.getNextID = getNextID; diff --git a/gate_svr/register-center.js b/gate_svr/register-center.js new file mode 100644 index 0000000..e69de29 diff --git a/lib/const-define.js b/lib/const-define.js new file mode 100644 index 0000000..e69de29 diff --git a/lib/rds-key.js b/lib/rds-key.js new file mode 100644 index 0000000..e69de29 diff --git a/protocol/packet.js b/protocol/packet.js new file mode 100644 index 0000000..e69de29