浏览代码

查询服务器

makela 6 月之前
父节点
当前提交
e1fd3adf03
共有 4 个文件被更改,包括 163 次插入40 次删除
  1. 120 40
      pay/channelsdk/get_server_info.js
  2. 22 0
      query/router.js
  3. 17 0
      query/server.js
  4. 4 0
      query_server.js

+ 120 - 40
pay/channelsdk/get_server_info.js

@@ -1,57 +1,137 @@
 //获取玩家区服数据
-var mysql = require('mysql');
-var mysqlcn = require('../../terry/mysqlcn.js');
-var query = mysqlcn.query;
-var qs = require('querystring');
-var encryption = require('../ordinary/encryption.js');
-var http = require('http');
+let mysql = require('mysql');
+let mysqlcn = require('../../terry/mysqlcn.js');
+let query = mysqlcn.query;
+let qs = require('querystring');
+let http = require('http');
 
-var express = require('express');
-var router = express.Router();
+let express = require('express');
+let router = express.Router();
 
+const timeout = 5000; // 设置超时时间为 5000 毫秒(5 秒)
 
-var server_query_info = function(args,res){
-    var sql = "SELECT * FROM services";
-    query(sql,function(qerr,vals,fields_){
-        if (qerr==null){
-            len = vals.length
-            var data = new Array()
-            for (var i = 0;i < vals.length; ++i){
-                console.log("查询服务器id:%s",vals[i].id);
-                // get_player_uid(vals[i],channel,account,vals[i].id,add_server);
-                data[i] = {
-                    "server_id": vals[i].id,
-                    "server_name": vals[i].name,
+// 创建一个封装 http 请求的 Promise
+function fetchDataFromServer(options, data) {
+    return new Promise((resolve, reject) => {
+        const req = http.request(options, (res) => {
+            let data = '';
+
+            res.on('data', (chunk) => {
+                data += chunk;
+            });
+
+            res.on('end', () => {
+                resolve(data);
+            });
+        });
+
+        req.on('error', (e) => {
+            reject(e);
+        });
+        req.write(data)
+        req.end();
+    });
+}
+
+// 创建一个超时的 Promise
+function timeoutPromise(ms) {
+    return new Promise((_, reject) => {
+        setTimeout(() => {
+            reject(new Error('请求超时'));
+        }, ms);
+    });
+}
+
+// 从多个 URL 获取数据,处理超时
+async function fetchAllDataWithTimeout(args, vals, timeout) {
+    const dataTable = new Array();
+    const timeoutPromiseInstance = timeoutPromise(timeout);
+    try {
+        // 使用 Promise.race 处理超时
+        for (let i = 0; i < vals.length; i++) {
+            const url = vals[i];
+            let data2game = JSON.stringify({
+                "sid" : vals[i].id,
+                "channel" : args.channel,
+                "account" : args.account,
+            })
+
+            let opt = {
+                method: "POST",
+                host: vals[i].ip,
+                port: vals[i].port,
+                path: "/check_server",
+                headers: {
+                    "Content-Type": 'application/json',
+                    "Content-Length": Buffer.byteLength(data2game, "utf8")
+                }
+            };
+            dataTable[i] = {
+                "server_id": vals[i].id,
+                "server_name": vals[i].name,
+                "state": 0,
+                "ip": vals[i].ip,
+                "port": vals[i].game,
+                "create": false,
+            }
+            const fetchPromise = fetchDataFromServer(opt, data2game);
+            try {
+                // 使用 Promise.race 处理每个请求的超时
+                const result = await Promise.race([fetchPromise, timeoutPromiseInstance]);
+                console.log(result)
+                if(result != "Not Found") {
+                    const obj = JSON.parse(result);
+                    if (obj.state == 0){
+                        dataTable[i].state = obj.open? 1:0
+                        dataTable[i].create = obj.create
+                    }
                 }
-				console.log("写入查询服务器id:%s",vals[i].id);
+            } catch(error) {
+                console.log(error);
             }
-            var returndata = JSON.stringify({
-                'code': 0,
-                'msg': "",
-                'data': data,
+        }
+        
+        return dataTable;
+    } catch (error) {
+        console.error('Error:', error);
+        throw error; // 重新抛出错误以便调用者处理
+    }
+}
+
+
+
+let server_query_info = function(args,res){
+    let sql = "SELECT * FROM services";
+    query(sql,function(qerr,vals,fields_){
+        if (qerr==null){
+            fetchAllDataWithTimeout(args, vals, timeout)
+            .then((dataTable) => {
+                let returndata = JSON.stringify({
+                    'code': 0,
+                    'msg': "",
+                    'data': dataTable,
+                });
+                res.send(returndata);
+            }).catch((error) => {
+                console.error('Error:', error);
+                res.send(JSON.stringify({ 'code':'400','msg':'稍后请求'}));
             });
-            console.log("查找mysql玩家角色服务器列表:%s",returndata);
-            res.send(returndata);
-        }else{
+
+        }
+        else{
             console.log("打开mysql库中服务器列表失败");
             try{
-                res.send(JSON.stringify({ 'status':'400','msg':'稍后请求'}));
+                res.send(JSON.stringify({ 'code':'400','msg':'稍后请求'}));
             }
             catch(e){}
         }
     });
 }
 
-//获取服务器列表
-router.get('/server_query_info', function(req, res) {
-    try{
-        console.log("[服务器列表查询] get server_query_info,host:%s, ip:%s,time:%s",req.hostname,req.ip,new Date());
-		server_query_info(req.query,res);
-	 }catch(err){
-		 console.log(err);
-		 var info = JSON.stringify({ 'state':'0'});
-		 res.send(info);
-     }
-})
+
+router.post('/server_query_info', (req, res) => {
+    // 解析请求体中的数据
+    server_query_info(req.body, res)
+});
 
 module.exports = router;

+ 22 - 0
query/router.js

@@ -0,0 +1,22 @@
+const express = require('express');
+const cors = require ('cors')
+const app = express();
+app.use(cors());
+app.use(express.json());
+app.use(express.urlencoded({ extended: true }));
+
+
+app.get('/', function (req, res) {
+  var real_ip = req.get("X-Real-IP") || req.get("X-Forwarded-For") || req.ip;
+  console.log("get,host:%s, ip:%s,date:%s",req.hostname,real_ip,new Date());
+  res.send('Hello World');
+})
+
+app.post('/', function (req, res) {
+  var real_ip = req.get("X-Real-IP") || req.get("X-Forwarded-For") || req.ip;
+  console.log("post,host:%s, ip:%s,date:%s",req.hostname,real_ip,new Date());
+  res.send('Hello World');
+})
+app.use('/', require("../pay/channelsdk/get_server_info")); 
+
+exports.app = app;

+ 17 - 0
query/server.js

@@ -0,0 +1,17 @@
+var http = require("http");
+
+function start(app) {
+	var httpServer = http.createServer(app);
+
+	process.on('uncaughtException', function(e) {
+		  console.log(e);
+		});
+
+	var server = app.listen(8888, function () {
+		var host = server.address().address
+		var port = server.address().port
+		console.log("应用实例,访问地址为 https://%s:%s", host, port)
+	})
+}
+
+exports.start = start;

+ 4 - 0
query_server.js

@@ -0,0 +1,4 @@
+var server = require("./query/server");
+var router = require("./query/router");
+
+server.start(router.app);