2025-03-26 13:43:47 +08:00

196 lines
5.2 KiB
TypeScript

import socket from '@ohos.net.socket';
import util from '@ohos.util';
interface RequestKey {
time: string
}
interface RequestCallback {
url: string
type: number
resolve: Function
reject: Function
timeout: number
}
interface RequestParams {
method: string
data: object
type: 0 | 1
contentType: string
timeout: number
}
interface Response {
serialNumber: string
data: string
isForwordHttp: string
}
let tag = "tcp request"
class TcpUtils {
private static instance: TcpUtils
private socket: socket.TCPSocket = socket.constructTCPSocketInstance()
private requestMap: Map<string, RequestCallback> = new Map<string, RequestCallback>()
private tick: number
private heartbeat: number
private cache: string = ''
private fileUtil = new FileUtil(AppStorage.get('context'))
private path = ""
constructor() {
if (!TcpUtils.instance) {
TcpUtils.instance = this
}
return TcpUtils.instance
}
async init() {
this.path = await this.fileUtil.initFolder('/config/tcpRequest')
this.socket.on("message", (res) => {
let decoder = util.TextDecoder.create()
let message = decoder.decodeWithStream(new Uint8Array(res.message))
console.log(tag, "on message", message)
this.cache += message
let start = this.cache.indexOf("^#")
let end = this.cache.indexOf("#$")
try {
if (start !== -1 && end !== -1) {
let message = this.cache.slice(start + 2, end)
this.cache = this.cache.slice(end + 2)
let tempIndex = message.indexOf("^#")
while (tempIndex > -1) {
message = message.slice(tempIndex + 2)
tempIndex = message.indexOf("^#")
}
let result: Response = JSON.parse(message)
let key = result.serialNumber
let data = result.data
let isSuccess = result.isForwordHttp === "1"
console.log(tag, "complete message")
let item = this.requestMap.get(key)
console.log(tag, "============", item?.url)
if (this.requestMap.get(key)?.type === 0) {
console.log(tag, "resolve message")
if (isSuccess) {
item?.resolve(JSON.parse(data))
} else {
item?.reject({
code: -1,
message: data || "request failed"
})
}
} else {
console.log(tag, "resolve message")
if (isSuccess) {
item?.resolve(data)
} else {
item?.reject({
code: -1,
message: data || "request failed"
})
}
}
this.requestMap.delete(key)
}
} catch (e) {
console.log(tag, "解析相应失败", JSON.stringify(e))
}
})
this.loop()
return this.socket.connect({
address: { address: "172.37.55.191", port: 19998 }
}).then(() => {
this.heartbeat = setInterval(() => {
this.send("heart", JSON.stringify({
isHeartBeat: 1
}), false)
}, 1000 * 6)
console.log(tag, "connect success")
}).catch(err => {
console.log(tag, JSON.stringify(err))
})
}
request(url: string, option: RequestParams, resolve, reject) {
let key = new Date().getTime()
this.requestMap.set(key + "", {
url,
resolve,
reject,
timeout: option.timeout,
type: option.type,
})
let message = {
url,
serialNumber: key,
type: option.type,
method: option.method,
data: option.data,
contentType: option.contentType,
isHeartBeat: "0",
}
this.send(key + "", JSON.stringify(message))
}
destroy() {
clearInterval(this.tick)
clearInterval(this.heartbeat)
}
private loop() {
this.tick = setInterval(() => {
let now = new Date().getTime()
this.requestMap.forEach((value, key) => {
if (now - Number(key) >= value.timeout) {
console.log("tcp request timeout url: ", value.url)
console.log("tcp request timeout key: ", key)
value.reject({
message: "tcp request timeout",
code: 2300028
})
this.requestMap.delete(key)
}
})
}, 100)
}
private async send(key: string, message: string, log: boolean = true) {
if (log) {
console.log(tag, 'send', message)
}
this.fileUtil.addFile(this.path + 'temp.txt', `^#${message}#$`)
this.socket.send({
data: `^#${message}#$`
}).then(() => {
if (log) {
console.log(tag, 'send success')
}
}).catch(async err => {
if (key !== "heart") {
console.log("tcp request send failed", this.requestMap.get(key).url)
this.requestMap.get(key).reject({
message: "tcp request send failed",
code: 2300007
})
}
await this.socket.close()
this.socket = socket.constructTCPSocketInstance()
await this.socket.connect({
address: { address: "172.37.55.191", port: 19998 }
}).then(res => {
console.log("tcp request reconnect success", JSON.stringify(res))
}).catch(err => {
console.log("tcp request reconnect failed", JSON.stringify(err))
})
console.log(tag, JSON.stringify(err))
})
}
}
export const tcpUtil = new TcpUtils()