89 lines
2.2 KiB
Plaintext
89 lines
2.2 KiB
Plaintext
import socket from '@ohos.net.socket'
|
|
import { BusinessError } from '@ohos.base'
|
|
import { TCPTag } from '../config'
|
|
|
|
|
|
export default class TcpClient {
|
|
private static instance: 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> = []
|
|
|
|
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(TCPTag, 'new Tcp', this.localIp, this.localIpPort, this.oppositeIp, this.oppositeIpPort)
|
|
this.tcp = socket.constructTCPSocketInstance();
|
|
this.bindTcp()
|
|
}
|
|
|
|
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()
|
|
}
|
|
|
|
onMsg(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)
|
|
})
|
|
}
|
|
|
|
offMsg(callback: Function) {
|
|
this.events = this.events.filter(cb => cb !== callback)
|
|
}
|
|
}
|