135 lines
5.2 KiB
JavaScript
135 lines
5.2 KiB
JavaScript
// socket客户端
|
||
const net = require('net');
|
||
|
||
module.exports = (app) => {
|
||
const { middleware } = app;
|
||
const packageBuild = middleware.packageBuild;
|
||
const utils = middleware.utils;
|
||
const parseDataPackage = middleware.parseDataPackage;
|
||
const shunt = middleware.shunt;
|
||
|
||
const client = new net.Socket();
|
||
|
||
let times, connectSwitch = true, reconnectSwitch = false;
|
||
|
||
setTimeout(() => {
|
||
reconnectSwitch = true;
|
||
}, 66000);
|
||
|
||
const createClient = () => {
|
||
if(connectSwitch) {
|
||
connectSwitch = false;
|
||
client.connect(app.config.socketClient.port, app.config.socketClient.ip, () => {
|
||
console.log(`socket: 连接到服务端: ${app.config.socketClient.ip + ':' + app.config.socketClient.port}`);
|
||
client.setKeepAlive(true, 60000);
|
||
reconnectSwitch = true;
|
||
});
|
||
}
|
||
};
|
||
|
||
createClient();
|
||
|
||
// 重连服务端
|
||
const reconnect = () => {
|
||
if (reconnectSwitch) {
|
||
reconnectSwitch = false;
|
||
setTimeout(() => {
|
||
connectSwitch = true;
|
||
createClient();
|
||
}, 66000);
|
||
}
|
||
};
|
||
|
||
client.on('connectTimeout', () => {
|
||
reconnect();
|
||
});
|
||
|
||
client.on('timeout', () => {
|
||
reconnect();
|
||
});
|
||
|
||
client.on('end', () => {
|
||
reconnect();
|
||
});
|
||
|
||
client.on('close', () => {
|
||
reconnect();
|
||
});
|
||
|
||
client.on('error', (err) => {
|
||
utils.log('../../../socketLog', err);
|
||
reconnect();
|
||
});
|
||
|
||
client.on('connect', () => {
|
||
// 连接成功后的逻辑...
|
||
client.write(packageBuild.packageBuild(app, [utils.packageItem(2, 100) + utils.packageItem(2, packageBuild.buildXFType100(app.config.socketClient.token).length / 2) + packageBuild.buildXFType100(app.config.socketClient.token)]));
|
||
});
|
||
|
||
client.on('data', async (data) => {
|
||
// 在这里可以处理从服务器接收到的数据
|
||
// utils.log('../../../socketLog', data);
|
||
let msg = parseDataPackage.parseDataPackage(middleware, data.toString('hex').slice(0, data.toString('hex').length - 16));
|
||
if (msg == utils.intrinsic.heart) {
|
||
clearTimeout(times);
|
||
times = setTimeout(() => {
|
||
client.write(Buffer.from(msg, 'hex'));
|
||
}, 10000);
|
||
} else {
|
||
let nowResult = shunt.socketResult(msg.dataContent.nowData);
|
||
let resendResult = shunt.socketResult(msg.dataContent.resendData);
|
||
// 当前消息处理
|
||
if (nowResult.type == 99) {
|
||
// token验证处理程序
|
||
if (nowResult.data == '1') {
|
||
client.write(Buffer.from(utils.intrinsic.heart, 'hex'));
|
||
} else {
|
||
reconnect();
|
||
}
|
||
} else if (nowResult.type == 4) {
|
||
const { msgContent } = nowResult.data;
|
||
const { outboundMsg, receiverAddress, originalMsg } = msgContent;
|
||
const { senderAddress, msgData, encodingCategory } = outboundMsg;
|
||
// socket接收消息后触发事件监听器,将消息发送给websocket客户端并存储在数据库中
|
||
shunt.socketEmitter().emit(senderAddress.data, { encode_type: parseInt(encodingCategory.data), msg_data: msgData.data, created_at: new Date() });
|
||
await app.curl('http://127.0.0.1:' + app.server.address().port + '/shortMsg', {
|
||
dataType: 'json',
|
||
contentType: 'application/x-www-form-urlencoded',
|
||
method: 'POST',
|
||
timeout: 3000,
|
||
data: {
|
||
card_id: senderAddress.data,
|
||
receiver_address: receiverAddress.data,
|
||
original_msg: originalMsg,
|
||
send_type: 0,
|
||
encode_type: parseInt(encodingCategory.data),
|
||
msg_data: msgData.data,
|
||
created_at: new Date()
|
||
},
|
||
});
|
||
}
|
||
// 重发消息处理
|
||
if (resendResult && resendResult.type == 4) {
|
||
const { msgContent } = resendResult.data;
|
||
const { outboundMsg, receiverAddress } = msgContent;
|
||
const { senderAddress, msgData, encodingCategory } = outboundMsg;
|
||
// socket接收消息后触发事件监听器,将消息发送给websocket客户端并存储在数据库中
|
||
shunt.socketEmitter().emit(senderAddress.data, msgData.data);
|
||
await app.curl('http://127.0.0.1:' + app.server.address().port + '/shortMsg', {
|
||
dataType: 'json',
|
||
contentType: 'application/x-www-form-urlencoded',
|
||
method: 'POST',
|
||
timeout: 3000,
|
||
data: {
|
||
card_id: senderAddress.data,
|
||
receiver_address: receiverAddress.data,
|
||
msg: data.toString(),
|
||
send_type: 1,
|
||
encode_type: parseInt(encodingCategory.data),
|
||
msg_data: msgData.data,
|
||
},
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}; |