const mytools = require("./mytools");
const mynet = require('net');
const mysql = require('mysql')
// 使用 createPool 建立连接池
var mysqlpool = mysql.createPool({
    host: '',
    user: '',
    password: '',
    database: '',
    port: ''
});


// 保存客户端
var g_clients = [];

//移除下线的客户端
function delete_client(temp_client_name) {
    g_clients = g_clients.filter(cn => {
        return cn != temp_client_name;
    })
}

// 创建服务器
const server = new mynet.createServer();
server.on('connection', (client) => {

    //局部客户端变量
    let client_name = client.remoteAddress + ":" + client.remotePort;
    g_clients.push(client_name);

    //设置超时时间为60秒(单位毫秒)因为设备间隔3s发送一次数据
    client.setTimeout(60 * 1000);
    client.on('timeout', () => {
        delete_client(client_name);
        mytools.logger().info(`客户端${client_name}超时,从客户端列表中删除!`);
        client.end();
    });
    client.on('data', function (msg) { //接收client发来的信息

        mytools.logger().info(`收到${client_name}:`, msg);

        if (!mytools.checkBuffer(msg)) {
            mytools.logger().info(`校验错误,系统自动返回! ${client_name}:`, msg);

        } else {
            let t_request = new mytools.myRequest();
            t_request.setBuffer(msg)
            let t_msg = mytools.getResponse(msg);


            mysqlpool.getConnection(function (err, connection) {
                //if (err) mytools.logger().info('MySQL数据库建立连接失败。');
                if (err) mytools.logger().info(err);
                else {
                    mytools.logger().info('数据库建立连接成功。');
                    connection.query('INSERT INTO basetb (链路地址,请求帧,响应帧,状态,电流,电场,电压,信号强度)  VALUES (?,?,?,?,?,?,?,?)', [t_request.getLianLuDiZhi(), t_request.to16String(), t_msg.toString("hex"), t_request.getStatus(), t_request.getDianLiu(), t_request.getDianChang(), t_request.getDianYa(), t_request.getXinHao()], function (err, data) {
                        if (err) mytools.logger().info('插入数据操作失败。');
                        else {
                            mytools.logger().info(data);
                            //连接释放很重要。但是不是有人写 mysqlpool.end(); 绝对错误
                            connection.release(); 
                        }
                    });
                }
            });

            client.write(t_msg, () => {
                logger().info(
                    `写入客户端${client_name}结束,响应值为:` + t_msg.toString('hex'));
            });
        }

    });

    client.on('error', function (e) { //监听客户端异常
        mytools.logger().info('>>>>>>client error: ' + e);
        delete_client(client_name);
        client.end();
        mytools.logger().info(`客户端${client_name}出错了!`);
        mytools.logger().info('<<<<<<client error!');
    });

    client.on('close', function () {
        mytools.logger().info('>>>>>>client close!');
        delete_client(client_name);
        mytools.logger().info(`客户端${client_name}下线了!`);
        mytools.logger().info('<<<<<<client close!');
    });
});
//这里的0.0.0.0非常重要,指定未ip4格式监听。
//127.0.0.1 localhost 上传到服务器,就无法连接(虽然本地是正常的) server.listen(7500, '0.0.0.0', function () { console.log(`服务器运行在:7500`); }); //每隔10s刷新数据库 setInterval(() => { //mytools.logger('oth').warn("当前客户端数量:", g_clients.length, "当前活动客户端列表:", g_clients); }, 90000); //链接终止指令,不要调用

 

posted on 2020-03-25 19:34  qqhfeng16  阅读(547)  评论(0编辑  收藏  举报