2024-06-27 20:53:36 +08:00

202 lines
7.1 KiB
TypeScript

import socket from '@ohos.net.socket';
import buffer from '@ohos.buffer';
const TAG = '[TcpDemo.TcpClient]'
import prompt from '@ohos.prompt'
import hilog from '@ohos.hilog';
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
console.log('tcp1111',this.localIp,this.localIpPort,this.oppositeIp,this.oppositeIpPort)
this.tcp = socket.constructTCPSocketInstance();
}
onError(callback?){
this.tcp.on('error', err => {
hilog.info(0x0000, 'testTag', "on error, err:" + JSON.stringify(err));
callback&&callback()
// this.closeUdp(()=>{
// this.bindUdp()
// })
});
}
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
let promise=this.tcp.bind({ address: this.localIp, port:parseInt(this.localIpPort), family: 1 }, err => {
if (err) {
hilog.info(0x0000, 'testTag', "tcpreBinderror:" + JSON.stringify(err));
resolve(true)
}
console.log('testTag,rebindtestTag tcp bind success');
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() {
console.log('tcpoppositeIp',this.oppositeIp,'localIp',this.localIp)
return new Promise((resolve,reject)=>{
let promise=this.tcp.bind({ address: this.localIp, port:parseInt(this.localIpPort), family: 1 }, err => {
if (err) {
console.log('testTag tcp bind faile');
hilog.info(0x0000, 'testTag', "tcpBinderror:" + JSON.stringify(err));
resolve(true)
return
}
console.log('testTag tcp bind success');
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(){
console.log('testTagtcbpoppositeIp',this.oppositeIp,this.oppositeIpPort,'localIp',this.localIp,this.localIpPort)
console.log('22323')
return new Promise((resolve,reject)=>{
let promise = this.tcp.connect({ address: {address: this.oppositeIp, port: parseInt(this.oppositeIpPort), family: 1} , timeout: 6000});
promise.then(() => {
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;
}
});
resolve(true)
}).catch(err => {
console.log('testTagconnect,error')
resolve(false)
});
})
}
sendMsg(msg: string) {
console.log('testTagsendoppositeIp',this.oppositeIp)
return new Promise((reslove,reject)=>{
let promise = this.tcp.send({
data:msg
});
promise.then(() => {
reslove(true)
}).catch(err => {
reslove(false)
});
})
// let promise = this.udp.send({
// data: msg,
// address: {
// // address: '192.168.7.124',
// // port: 30013,
// // address: '192.168.7.124',
// // port: 20022,
// address: this.oppositeIp,
// port: parseInt(this.oppositeIpPort),
// family: 1
// }
// });
// promise.then(() => {
// console.log(`${TAG} udp send success:${msg}`);
// }).catch(err => {
// console.log(`${TAG} udp send fail:${JSON.stringify(err)}`);
// });
}
onMessage(callback?) {
this.tcp.on('message', value => {
// console.log('messageLengt',,value.message.length))
console.log('testTagtcpmsg')
// 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);
callback&&callback(Arraybuffer)
}else{
callback&&callback('')
}
// callback(value.message)
});
// this.udp.on('message', value => {
// // 收到的是ArrayBuffer 需要进行转换解析
// if (value) {
// let dataView = new DataView(value.message)
// // console.log(`${TAG} udp message length:${dataView?.byteLength}`);
// let str = ""
// for (let i = 0;i < dataView?.byteLength; ++i) {
// let c = String.fromCharCode(dataView?.getUint8(i))
// if (c !== "\n") {
// str += c
// }
// }
// console.log(`${TAG} udp on message array buffer:${str}`);
// callback(str)
// }else{
// callback('')
// }
//
//
// });
}
offTcp(callback) {
this.tcp.off('testTagofmessg', callback);
}
closeTcp(callback) {
return new Promise((reslove,reject)=>{
let promise = this.tcp.close();
promise.then(() => {
console.log('testTagclose success');
callback()
reslove(true)
}).catch(err => {
console.log('testTagclose fail');
reslove(false)
});
})
}
}