优化tcp
This commit is contained in:
		
							parent
							
								
									58d44fbe45
								
							
						
					
					
						commit
						3548124f9f
					
				
							
								
								
									
										80
									
								
								entry/src/main/ets/utils/TcpUtils.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								entry/src/main/ets/utils/TcpUtils.ets
									
									
									
									
									
										Normal 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() | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user