diff --git a/entry/src/main/ets/tcp2byte/index.ts b/entry/src/main/ets/tcp2byte/index.ts index d8c9340c..73ea96f8 100644 --- a/entry/src/main/ets/tcp2byte/index.ts +++ b/entry/src/main/ets/tcp2byte/index.ts @@ -20,6 +20,7 @@ const config = { const singleTcpClient = (function () { let instance; + function createInstance() { return socket.constructTCPSocketInstance() } @@ -35,55 +36,105 @@ const singleTcpClient = (function () { })(); export default async function tcp2ByteRequest(data): Promise { - return new Promise(async (resolve, reject) => { - const tcpClient: socket.TCPSocket = singleTcpClient.getClient() + const tcpClient: socket.TCPSocket = singleTcpClient.getClient(); + const { address, port } = config; + const tcp2Byte = new TcpToByte(); + const sendData = tcp2Byte.getRequest(data); + console.info(TAG, 'sendData=>' + JSON.stringify(sendData)); - const {address,port} = config - const tcp2Byte = new TcpToByte() - const sendData = tcp2Byte.getRequest(data) - console.info(TAG, 'sendData=>' + JSON.stringify(sendData)) + // 设置超时时间(例如 10 秒) + const timeoutDuration = 15000; // 10 秒 + let timeoutHandle: number | null = null; + + // 超时处理函数 + const timeoutPromise = new Promise((_, rejectTimeout) => { + timeoutHandle = setTimeout(() => { + const errMsg = 'TCP request timed out'; + console.log(TAG, "超时", errMsg); + promptAction.showToast({ + message: errMsg, + duration: 3000, + }); + tcpClient.close(); + rejectTimeout(new Error(errMsg)); + }, timeoutDuration); + }); try { await tcpClient.connect({ address: { - address, port - } - }) - //发送消息 - handSendMessage(tcpClient, data.sjbs, sendData) + address, + port, + }, + }); + + // 发送消息 + handSendMessage(tcpClient, data.sjbs, sendData); } catch (e) { - console.log(TAG, 'tcp client connect error' + JSON.stringify(e)) + console.log(TAG, 'tcp client connect error' + JSON.stringify(e)); promptAction.showToast({ message: 'tcp client connect error' + JSON.stringify(e), - duration: 3000 + duration: 3000, }); - reject(e) + reject(e); + return; } - //收到消息 + // 收到消息 tcpClient.on('message', (data) => { - const res = handReceiveMessage(tcpClient, sendData, data.message) + const res = handReceiveMessage(tcpClient, sendData, data.message); if (res) { - tcpClient.close() - resolve(res) + if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时 + tcpClient.close(); + resolve(res); } - }) + }); tcpClient.on('error', (e) => { - const errMsg = 'tcp client receive error' + JSON.stringify(e) + const errMsg = 'tcp client receive error' + JSON.stringify(e); promptAction.showToast({ message: 'tcp client receive error' + JSON.stringify(e), - duration: 3000 + duration: 3000, }); - console.log(TAG, errMsg) - tcpClient.close() + console.log(TAG, errMsg); + if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时 + tcpClient.close(); resolve({ - code: -1, message: errMsg - }) - }) + code: 2300028, + message: errMsg, + }); + }); - }) + // 使用 Promise.race 处理超时和 TCP 请求 + Promise.race([timeoutPromise, new Promise((resolveMain) => { + // 将 resolve 逻辑移到此处 + tcpClient.on('message', (data) => { + const res = handReceiveMessage(tcpClient, sendData, data.message); + if (res) { + resolveMain(res); + } + }); + + tcpClient.on('error', (e) => { + const errMsg = 'tcp client receive error' + JSON.stringify(e); + resolveMain({ + code: 2300028, + message: errMsg, + }); + }); + })]) + .then((result) => { + if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时 + tcpClient.close(); + resolve(result); + }) + .catch((error) => { + if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时 + tcpClient.close(); + reject(error); + }); + }); } //处理发送的数据 @@ -94,7 +145,8 @@ function handSendMessage(client: socket.TCPSocket, type, data) { case '02-21-000009': case '02-21-000012': case '02-21-000014': - data.forEach((item) => { + data.forEach((item, index) => { + console.log(TAG, "分包", index.toString(), JSON.stringify(item)) client.send({ data: new Uint8Array(item).buffer }) }) break; @@ -103,7 +155,6 @@ function handSendMessage(client: socket.TCPSocket, type, data) { case '02-21-000013': client.send({ data: new Uint8Array(data).buffer }) break; - default: break; } @@ -133,6 +184,7 @@ function handReceiveMessage(client: socket.TCPSocket, sendData, rData: ArrayBuff const end = start + 1; const packageIndex = bytesToDecimal([packages[start], packages[end]]); console.info(TAG, '补包内容' + JSON.stringify(new Uint8Array(sendData[packageIndex -1]))) + printInBatches(new Uint8Array(sendData[packageIndex -1]), 100) client.send({ data: new Uint8Array(sendData[packageIndex -1]).buffer }); }) } else { @@ -149,4 +201,11 @@ function handReceiveMessage(client: socket.TCPSocket, sendData, rData: ArrayBuff message: messageContent } } +} + +function printInBatches(array, batchSize) { + for (let i = 0; i < array.length; i += batchSize) { + const batch = array.slice(i, i + batchSize); + console.log(TAG, "补包细分", batch); + } } \ No newline at end of file