优化tcp

This commit is contained in:
lixiao 2025-02-12 09:02:46 +08:00
parent 58d44fbe45
commit 3548124f9f

View File

@ -0,0 +1,80 @@
import socket from '@ohos.net.socket'
import { BusinessError } from '@ohos.base'
const TAG = '[TcpClient]'
class TcpClient {
private localIp: string = ''
private localIpPort: string = ''
private oppositeIp: string = ''
private oppositeIpPort: string = ''
private tcpSendNum: number = 0
private tcp: socket.TCPSocket = null
private events: Array<Function> = []
private static instance: TcpClient
constructor() {
if (!TcpClient.instance) {
TcpClient.instance = this
}
return TcpClient.instance
}
init(tcpLocalIp: string, tcpLocalIpPort: string, tcpOppositeIp: string, tcpOppositePort: string) {
this.localIp = tcpLocalIp
this.oppositeIp = tcpOppositeIp
this.localIpPort = tcpLocalIpPort
this.oppositeIpPort = tcpOppositePort
console.log(TAG, 'new Tcp', this.localIp, this.localIpPort, this.oppositeIp, this.oppositeIpPort)
this.tcp = socket.constructTCPSocketInstance();
}
bindTcp(): Promise<void> {
return this.tcp.bind({ address: this.localIp, port: parseInt(this.localIpPort), family: 1 }).then(() => {
return this.tcp.connect({
address: { address: this.oppositeIp, port: parseInt(this.oppositeIpPort) },
timeout: 6000
})
}).then(() => {
try {
this.tcp.on("message", value => {
let data = new DataView(value.message)
this.events.forEach(cb => {
cb(value.message.slice(5, data.byteLength))
})
})
return Promise.resolve()
} catch (e) {
return Promise.reject(e)
}
})
}
async reBind() {
await this.close()
this.tcp = socket.constructTCPSocketInstance();
await this.bindTcp()
}
close(): Promise<void> {
return this.tcp?.close()
}
onMessage(callback: Function) {
this.events.push(callback)
}
sendMsg(data: string): Promise<void> {
return this.tcp?.send({ data }).catch(async (err: BusinessError) => {
this.tcpSendNum++
if (this.tcpSendNum > 10) {
this.tcpSendNum = 0
await this.reBind()
}
return Promise.reject(err)
})
}
}
export const tcpClient = new TcpClient()