176 lines
6.3 KiB
TypeScript
Raw Normal View History

2024-01-05 11:11:15 +08:00
import socket from '@ohos.net.socket';
import buffer from '@ohos.buffer';
2024-07-03 16:19:55 +08:00
const TAG = 'socketTag[TcpDemo.TcpClient]'
2024-01-05 11:11:15 +08:00
import prompt from '@ohos.prompt'
2024-05-16 09:53:10 +08:00
import hilog from '@ohos.hilog';
2024-01-05 11:11:15 +08:00
export default class TcpClient {
private localIp: string = ''
private localIpPort: string = ''
private oppositeIp: string = ''
private oppositeIpPort: string = ''
private tcp: any = null
constructor(tcplocalIp: string, tcplocalIpPort:string,tcpOppositeIp: string,tcpOppositePort:string) {
this.localIp = tcplocalIp
this.oppositeIp = tcpOppositeIp
this.localIpPort = tcplocalIpPort
this.oppositeIpPort = tcpOppositePort
2024-07-03 16:19:55 +08:00
console.log(TAG,'new Tcp',this.localIp,this.localIpPort,this.oppositeIp,this.oppositeIpPort)
2024-01-05 11:11:15 +08:00
this.tcp = socket.constructTCPSocketInstance();
}
2024-05-16 09:53:10 +08:00
onError(callback?){
this.tcp.on('error', err => {
2024-07-03 16:19:55 +08:00
console.log(TAG,'tcpOnerror', JSON.stringify(err))
2024-07-19 13:27:51 +08:00
setTimeout(async ()=>{
await this.bindTcp()
await this.connectTcp()
this.onMessage(callback)
},2000)
2024-05-16 09:53:10 +08:00
// this.closeUdp(()=>{
// this.bindUdp()
// })
});
}
2024-01-05 11:11:15 +08:00
rebindTcp(localIp: string, localIpPort:string,oppositeIp: string,oppositeIpPort:string){
return new Promise((resolve, reject)=>{
this.localIp = localIp
this.oppositeIp = oppositeIp
this.localIpPort = localIpPort
this.oppositeIpPort = oppositeIpPort
2024-07-03 16:19:55 +08:00
console.log(TAG,'tcpreBind', this.localIp,this.localIpPort)
2024-07-09 11:11:31 +08:00
let promise=this.tcp.bind({ address: this.localIp, port:parseInt(this.localIpPort), family: 1 }, err => {
2024-01-05 11:11:15 +08:00
if (err) {
2024-07-05 09:08:17 +08:00
globalThis.getCloseTcp=true
2024-06-27 20:53:36 +08:00
hilog.info(0x0000, 'testTag', "tcpreBinderror:" + JSON.stringify(err));
2024-01-05 11:11:15 +08:00
resolve(true)
}
2024-06-27 20:53:36 +08:00
console.log('testTag,rebindtestTag tcp bind success');
2024-07-05 09:08:17 +08:00
globalThis.getCloseTcp=false
2024-01-05 11:11:15 +08:00
resolve(false)
})
})
// let promise = this.udp.bind({
// // address: '192.168.7.170', port: 20122, family: 1
// // address: '192.168.7.170', port: 31013, family: 1
// address: this.localIp, port: parseInt(this.localIpPort), family: 1
// });
}
bindTcp() {
2024-07-03 16:19:55 +08:00
console.log(TAG,'tcpbind',this.localIp,'localIp',this.localIpPort)
2024-01-05 11:11:15 +08:00
return new Promise((resolve,reject)=>{
2024-07-09 11:11:31 +08:00
let promise=this.tcp.bind({ address: this.localIp, port:parseInt(this.localIpPort), family: 1 }, err => {
2024-01-05 11:11:15 +08:00
if (err) {
2024-05-27 17:25:20 +08:00
console.log('testTag tcp bind faile');
2024-07-05 09:08:17 +08:00
globalThis.getCloseTcp=true
2024-05-16 09:53:10 +08:00
hilog.info(0x0000, 'testTag', "tcpBinderror:" + JSON.stringify(err));
2024-01-05 11:11:15 +08:00
resolve(true)
2024-05-27 17:25:20 +08:00
return
2024-01-05 11:11:15 +08:00
}
2024-07-05 09:08:17 +08:00
globalThis.getCloseTcp=false
2024-05-27 17:25:20 +08:00
console.log('testTag tcp bind success');
2024-01-05 11:11:15 +08:00
resolve(false)
})
})
console.log('localIp',this.localIp)
console.log('localIpPort',this.localIpPort)
// let promise = this.udp.bind({
// // address: '192.168.7.170', port: 20122, family: 1
// // address: '192.168.7.170', port: 31013, family: 1
// address: this.localIp, port: parseInt(this.localIpPort), family: 1
// });
}
connectTcp(){
2024-07-03 16:19:55 +08:00
console.log(TAG,'tcpConnect',this.oppositeIp,'localIp',this.oppositeIpPort)
2024-01-05 11:11:15 +08:00
return new Promise((resolve,reject)=>{
2024-07-09 11:11:31 +08:00
let promise = this.tcp.connect({ address: {address: this.oppositeIp, port: parseInt(this.oppositeIpPort), family: 1} , timeout: 6000});
2024-01-05 11:11:15 +08:00
promise.then(() => {
2024-05-27 17:25:20 +08:00
2024-01-05 11:11:15 +08:00
this.tcp.setExtraOptions({
keepAlive: true,
// OOBInline: true,
// TCPNoDelay: true,
// socketLinger: { on:true, linger:10 },
// receiveBufferSize: 1000,
// sendBufferSize: 1000,
// reuseAddress: true,
// socketTimeout: 3000,
},err => {
if (err) {
return;
}
});
2024-07-05 09:08:17 +08:00
globalThis.getCloseTcp=false
2024-01-05 11:11:15 +08:00
resolve(true)
}).catch(err => {
2024-07-05 09:08:17 +08:00
globalThis.getCloseTcp=true
2024-07-19 13:27:51 +08:00
setTimeout(()=>{
this.connectTcp()
},2000)
2024-05-27 17:25:20 +08:00
console.log('testTagconnect,error')
2024-07-19 13:27:51 +08:00
2024-01-05 11:11:15 +08:00
});
})
}
2024-05-27 17:25:20 +08:00
sendMsg(msg: string) {
2024-07-03 16:19:55 +08:00
console.log(TAG,'tcpSend',msg.length,msg)
2024-01-05 11:11:15 +08:00
return new Promise((reslove,reject)=>{
let promise = this.tcp.send({
data:msg
});
promise.then(() => {
reslove(true)
}).catch(err => {
reslove(false)
});
})
}
2024-05-27 17:25:20 +08:00
onMessage(callback?) {
2024-01-05 11:11:15 +08:00
this.tcp.on('message', value => {
2024-07-03 16:19:55 +08:00
console.log(TAG,'Tcponmessage',value.length,value)
2024-01-05 11:11:15 +08:00
// console.log('messageLengt',,value.message.length))
2024-06-27 20:53:36 +08:00
console.log('testTagtcpmsg')
2024-01-05 11:11:15 +08:00
// console.log("on message, message:" + value.message+ ", remoteInfo:" )
if (value) {
let dataView = new DataView(value.message)
// const Arraybuffer=buffer.from(value.message, 5, dataView?.byteLength);
const Arraybuffer=value.message.slice(5, dataView?.byteLength);
2024-05-27 17:25:20 +08:00
callback&&callback(Arraybuffer)
2024-01-05 11:11:15 +08:00
}else{
2024-05-27 17:25:20 +08:00
callback&&callback('')
2024-01-05 11:11:15 +08:00
}
// callback(value.message)
});
}
offTcp(callback) {
2024-07-03 16:19:55 +08:00
console.log(TAG,'tcpofff')
this.tcp.off('testTagofmessg', callback);
2024-01-05 11:11:15 +08:00
}
closeTcp(callback) {
return new Promise((reslove,reject)=>{
2024-07-03 16:19:55 +08:00
console.log(TAG,'tcpClose')
2024-01-05 11:11:15 +08:00
let promise = this.tcp.close();
promise.then(() => {
2024-07-05 09:08:17 +08:00
globalThis.getCloseTcp=true
2024-07-03 16:19:55 +08:00
console.log(TAG,'tcpCloseSuccess')
2024-05-16 09:53:10 +08:00
callback()
2024-01-05 11:11:15 +08:00
reslove(true)
}).catch(err => {
2024-07-03 16:19:55 +08:00
console.log(TAG,'tcpClosefailed')
2024-01-05 11:11:15 +08:00
reslove(false)
});
})
}
}