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); //链接终止指令,不要调用
来源:https://www.cnblogs.com/qqhfeng/p/12568795.html