1# Socket 连接 2 3## 简介 4 5Socket 连接主要是通过 Socket 进行数据传输,支持 TCP/UDP/Multicast/TLS 协议。 6 7## 基本概念 8 9- Socket:套接字,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 10- TCP:传输控制协议(Transmission Control Protocol)。是一种面向连接的、可靠的、基于字节流的传输层通信协议。 11- UDP:用户数据报协议(User Datagram Protocol)。是一个简单的面向消息的传输层,不需要连接。 12- Multicast:多播,基于UDP的一种通信模式,用于实现组内所有设备之间广播形式的通信。 13- LocalSocket:本地套接字,IPC(Inter-Process Communication)进程间通信的一种,实现设备内进程之间相互通信,无需网络。 14- TLS:安全传输层协议(Transport Layer Security)。用于在两个通信应用程序之间提供保密性和数据完整性。 15 16## 场景介绍 17 18应用通过 Socket 进行数据传输,支持 TCP/UDP/Multicast/TLS 协议。主要场景有: 19 20- 应用通过 TCP/UDP Socket进行数据传输 21- 应用通过 TCP Socket Server 进行数据传输 22- 应用通过 Multicast Socket 进行数据传输 23- 应用通过 Local Socket进行数据传输 24- 应用通过 Local Socket Server 进行数据传输 25- 应用通过 TLS Socket 进行加密数据传输 26- 应用通过 TLS Socket Server 进行加密数据传输 27 28## 接口说明 29 30完整的 API 说明以及实例代码请参考:[Socket 连接](../reference/apis-network-kit/js-apis-socket.md)。 31 32Socket 连接主要由 socket 模块提供。具体接口说明如下表。 33 34| 接口名 | 描述 | 35| ---------------------------------- | ------------------------------------------------------------------------------ | 36| constructUDPSocketInstance() | 创建一个 UDPSocket 对象。 | 37| constructTCPSocketInstance() | 创建一个 TCPSocket 对象。 | 38| constructTCPSocketServerInstance() | 创建一个 TCPSocketServer 对象。 | 39| constructMulticastSocketInstance() | 创建一个 MulticastSocket 对象。 | 40| constructLocalSocketInstance() | 创建一个 LocalSocket 对象。 | 41| constructLocalSocketServerInstance() | 创建一个 LocalSocketServer 对象。 | 42| listen() | 绑定、监听并启动服务,接收客户端的连接请求。(仅 TCP/LocalSocket 支持)。 | 43| bind() | 绑定 IP 地址和端口,或是绑定本地套接字路径。 | 44| send() | 发送数据。 | 45| close() | 关闭连接。 | 46| getState() | 获取 Socket 状态。 | 47| connect() | 连接到指定的 IP 地址和端口,或是连接到本地套接字(仅 TCP/LocalSocket 支持)。 | 48| getRemoteAddress() | 获取对端 Socket 地址(仅 TCP 支持,需要先调用 connect 方法)。 | 49| setExtraOptions() | 设置 Socket 连接的其他属性。 | 50| getExtraOptions() | 获取 Socket 连接的其他属性(仅 LocalSocket 支持)。 | 51| addMembership() | 加入到指定的多播组 IP 中 (仅 Multicast 支持)。 | 52| dropMembership() | 从指定的多播组 IP 中退出 (仅 Multicast 支持)。 | 53| setMulticastTTL() | 设置数据传输跳数 TTL (仅 Multicast 支持)。 | 54| getMulticastTTL() | 获取数据传输跳数 TTL (仅 Multicast 支持)。 | 55| setLoopbackMode() | 设置回环模式,允许主机在本地循环接收自己发送的多播数据包 (仅 Multicast 支持)。 | 56| getLoopbackMode() | 获取回环模式开启或关闭的状态 (仅 Multicast 支持)。 | 57| on(type: 'message') | 订阅 Socket 连接的接收消息事件。 | 58| off(type: 'message') | 取消订阅 Socket 连接的接收消息事件。 | 59| on(type: 'close') | 订阅 Socket 连接的关闭事件。 | 60| off(type: 'close') | 取消订阅 Socket 连接的关闭事件。 | 61| on(type: 'error') | 订阅 Socket 连接的 Error 事件。 | 62| off(type: 'error') | 取消订阅 Socket 连接的 Error 事件。 | 63| on(type: 'listening') | 订阅 UDPSocket 连接的数据包消息事件(仅 UDP 支持)。 | 64| off(type: 'listening') | 取消订阅 UDPSocket 连接的数据包消息事件(仅 UDP 支持)。 | 65| on(type: 'connect') | 订阅 Socket 的连接事件(仅 TCP/LocalSocket 支持)。 | 66| off(type: 'connect') | 取消订阅 Socket 的连接事件(仅 TCP/LocalSocket 支持)。 | 67 68TLS Socket 连接主要由 tls_socket 模块提供。具体接口说明如下表。 69 70| 接口名 | 功能描述 | 71| ---------------------------- | ---------------------------------------------------------- | 72| constructTLSSocketInstance() | 创建一个 TLSSocket 对象。 | 73| bind() | 绑定 IP 地址和端口号。 | 74| close(type: 'error') | 关闭连接。 | 75| connect() | 连接到指定的 IP 地址和端口。 | 76| getCertificate() | 返回表示本地证书的对象。 | 77| getCipherSuite() | 返回包含协商的密码套件信息的列表。 | 78| getProtocol() | 返回包含当前连接协商的 SSL/TLS 协议版本的字符串。 | 79| getRemoteAddress() | 获取 TLSSocket 连接的对端地址。 | 80| getRemoteCertificate() | 返回表示对等证书的对象。 | 81| getSignatureAlgorithms() | 在服务器和客户端之间共享的签名算法列表,按优先级降序排列。 | 82| getState() | 获取 TLSSocket 连接的状态。 | 83| off(type: 'close') | 取消订阅 TLSSocket 连接的关闭事件。 | 84| off(type: 'error') | 取消订阅 TLSSocket 连接的 Error 事件。 | 85| off(type: 'message') | 取消订阅 TLSSocket 连接的接收消息事件。 | 86| on(type: 'close') | 订阅 TLSSocket 连接的关闭事件。 | 87| on(type: 'error') | 订阅 TLSSocket 连接的 Error 事件。 | 88| on(type: 'message') | 订阅 TLSSocket 连接的接收消息事件。 | 89| send() | 发送数据。 | 90| setExtraOptions() | 设置 TLSSocket 连接的其他属性。 | 91 92## 应用 TCP/UDP 协议进行通信 93 94UDP 与 TCP 流程大体类似,下面以 TCP 为例: 95 961. import 需要的 socket 模块。 97 982. 创建一个 TCPSocket 连接,返回一个 TCPSocket 对象。 99 1003. (可选)订阅 TCPSocket 相关的订阅事件。 101 1024. 绑定 IP 地址和端口,端口可以指定或由系统随机分配。 103 1045. 连接到指定的 IP 地址和端口。 105 1066. 发送数据。 107 1087. Socket 连接使用完毕后,主动关闭。 109 110```ts 111import socket from '@ohos.net.socket'; 112import { BusinessError } from '@ohos.base'; 113 114class SocketInfo { 115 message: ArrayBuffer = new ArrayBuffer(1); 116 remoteInfo: socket.SocketRemoteInfo = {} as socket.SocketRemoteInfo; 117} 118// 创建一个TCPSocket连接,返回一个TCPSocket对象。 119let tcp = socket.constructTCPSocketInstance(); 120tcp.on('message', (value: SocketInfo) => { 121 console.log("on message"); 122 let buffer = value.message; 123 let dataView = new DataView(buffer); 124 let str = ""; 125 for (let i = 0; i < dataView.byteLength; ++i) { 126 str += String.fromCharCode(dataView.getUint8(i)); 127 } 128 console.log("on connect received:" + str); 129}); 130tcp.on('connect', () => { 131 console.log("on connect"); 132}); 133tcp.on('close', () => { 134 console.log("on close"); 135}); 136 137// 绑定本地IP地址和端口。 138let ipAddress : socket.NetAddress = {} as socket.NetAddress; 139ipAddress.address = "192.168.xxx.xxx"; 140ipAddress.port = 1234; 141tcp.bind(ipAddress, (err: BusinessError) => { 142 if (err) { 143 console.log('bind fail'); 144 return; 145 } 146 console.log('bind success'); 147 148 // 连接到指定的IP地址和端口。 149 ipAddress.address = "192.168.xxx.xxx"; 150 ipAddress.port = 5678; 151 152 let tcpConnect : socket.TCPConnectOptions = {} as socket.TCPConnectOptions; 153 tcpConnect.address = ipAddress; 154 tcpConnect.timeout = 6000; 155 156 tcp.connect(tcpConnect, (err: BusinessError) => { 157 if (err) { 158 console.log('connect fail'); 159 return; 160 } 161 console.log('connect success'); 162 // 发送数据 163 let tcpSendOptions : socket.TCPSendOptions = {} as socket.TCPSendOptions; 164 tcpSendOptions.data = 'Hello, server!'; 165 tcp.send(tcpSendOptions, (err: BusinessError) => { 166 if (err) { 167 console.log('send fail'); 168 return; 169 } 170 console.log('send success'); 171 }) 172 }); 173}); 174 175// 连接使用完毕后,主动关闭。取消相关事件的订阅。 176setTimeout(() => { 177 tcp.close((err: BusinessError) => { 178 console.log('close socket.'); 179 }); 180 tcp.off('message'); 181 tcp.off('connect'); 182 tcp.off('close'); 183}, 30 * 1000); 184``` 185 186## 应用通过 TCP Socket Server 进行数据传输 187 188### 开发步骤 189 190服务端 TCP Socket 流程: 191 1921. import 需要的 socket 模块。 1932. 创建一个 TCPSocketServer 连接,返回一个 TCPSocketServer 对象。 1943. 绑定本地 IP 地址和端口,监听并接受与此套接字建立的客户端 TCPSocket 连接。 1954. 订阅 TCPSocketServer 的 connect 事件,用于监听客户端的连接状态。 1965. 客户端与服务端建立连接后,返回一个 TCPSocketConnection 对象,用于与客户端通信。 1976. 订阅 TCPSocketConnection 相关的事件,通过 TCPSocketConnection 向客户端发送数据。 1987. 主动关闭与客户端的连接。 1998. 取消 TCPSocketConnection 和 TCPSocketServer 相关事件的订阅。 200 201```ts 202import socket from '@ohos.net.socket'; 203import { BusinessError } from '@ohos.base'; 204// 创建一个TCPSocketServer连接,返回一个TCPSocketServer对象。 205let tcpServer = socket.constructTCPSocketServerInstance(); 206// 绑定本地IP地址和端口,进行监听 207 208let ipAddress : socket.NetAddress = {} as socket.NetAddress; 209ipAddress.address = "192.168.xxx.xxx"; 210ipAddress.port = 4651; 211tcpServer.listen(ipAddress, (err: BusinessError) => { 212 if (err) { 213 console.log("listen fail"); 214 return; 215 } 216 console.log("listen success"); 217}); 218 219class SocketInfo { 220 message: ArrayBuffer = new ArrayBuffer(1); 221 remoteInfo: socket.SocketRemoteInfo = {} as socket.SocketRemoteInfo; 222} 223// 订阅TCPSocketServer的connect事件 224tcpServer.on("connect", (client: socket.TCPSocketConnection) => { 225 // 订阅TCPSocketConnection相关的事件 226 client.on("close", () => { 227 console.log("on close success"); 228 }); 229 client.on("message", (value: SocketInfo) => { 230 let buffer = value.message; 231 let dataView = new DataView(buffer); 232 let str = ""; 233 for (let i = 0; i < dataView.byteLength; ++i) { 234 str += String.fromCharCode(dataView.getUint8(i)); 235 } 236 console.log("received message--:" + str); 237 console.log("received address--:" + value.remoteInfo.address); 238 console.log("received family--:" + value.remoteInfo.family); 239 console.log("received port--:" + value.remoteInfo.port); 240 console.log("received size--:" + value.remoteInfo.size); 241 }); 242 243 // 向客户端发送数据 244 let tcpSendOptions : socket.TCPSendOptions = {} as socket.TCPSendOptions; 245 tcpSendOptions.data = 'Hello, client!'; 246 client.send(tcpSendOptions, (err: BusinessError) => { 247 if (err) { 248 console.log("send fail"); 249 return; 250 } 251 console.log("send success"); 252 }); 253 254 // 关闭与客户端的连接 255 client.close((err: BusinessError) => { 256 if (err) { 257 console.log("close fail"); 258 return; 259 } 260 console.log("close success"); 261 }); 262 263 // 取消TCPSocketConnection相关的事件订阅 264 setTimeout(() => { 265 client.off("message"); 266 client.off("close"); 267 }, 10 * 1000); 268}); 269 270// 取消TCPSocketServer相关的事件订阅 271setTimeout(() => { 272 tcpServer.off("connect"); 273}, 30 * 1000); 274``` 275 276## 应用通过 Multicast Socket 进行数据传输 277 278### 开发步骤 279 2801. import 需要的 socket 模块。 281 2822. 创建 multicastSocket 多播对象。 283 2843. 指定多播 IP 与端口,加入多播组。 285 2864. 开启消息 message 监听。 287 2885. 发送数据,数据以广播的形式传输,同一多播组中已经开启消息 message 监听的多播对象都会接收到数据。 289 2906. 关闭 message 消息的监听。 291 2927. 退出多播组。 293 294```ts 295import socket from '@ohos.net.socket' 296// 创建Multicast对象 297let multicast = socket.constructMulticastSocketInstance(); 298 299let addr : socket.NetAddress = { 300 address: '239.255.0.1', 301 port: 32123, 302 family: 1 303} 304 305// 加入多播组 306multicast.addMembership(addr, (err: Object) => { 307 if (err) { 308 console.info('add err: ' + JSON.stringify(err)); 309 return; 310 } 311 console.info('add ok'); 312}) 313 314// 开启监听消息数据,将接收到的ArrayBuffer类型数据转换为String 315class SocketInfo { 316 message: ArrayBuffer = new ArrayBuffer(1); 317 remoteInfo: socket.SocketRemoteInfo = {} as socket.SocketRemoteInfo; 318} 319multicast.on('message', (data: SocketInfo) => { 320 console.info('接收的数据: ' + JSON.stringify(data)) 321 const uintArray = new Uint8Array(data.message) 322 let str = '' 323 for (let i = 0; i < uintArray.length; ++i) { 324 str += String.fromCharCode(uintArray[i]) 325 } 326 console.info(str) 327}) 328 329// 发送数据 330multicast.send({ data:'Hello12345', address: addr }, (err: Object) => { 331 if (err) { 332 console.info('发送失败: ' + JSON.stringify(err)); 333 return; 334 } 335 console.info('发送成功'); 336}) 337 338// 关闭消息的监听 339multicast.off('message') 340 341// 退出多播组 342multicast.dropMembership(addr, (err: Object) => { 343 if (err) { 344 console.info('drop err ' + JSON.stringify(err)); 345 return; 346 } 347 console.info('drop ok'); 348}) 349``` 350 351## 应用通过 LocalSocket 进行数据传输 352 353### 开发步骤: 354 3551. import 需要的 socket 模块。 356 3572. 使用 constructLocalSocketInstance 接口,创建一个 LocalSocket 客户端对象。 358 3593. 注册 LocalSocket 的消息(message)事件,以及一些其它事件(可选)。 360 3614. 连接到指定的本地套接字文件路径。 362 3635. 发送数据。 364 3656. Socket 连接使用完毕后,取消事件的注册,并关闭套接字。 366 367```ts 368import socket from '@ohos.net.socket'; 369 370// 创建一个LocalSocket连接,返回一个LocalSocket对象。 371let client = socket.constructLocalSocketInstance(); 372client.on('message', (value: socket.LocalSocketMessageInfo) => { 373 const uintArray = new Uint8Array(value.message) 374 let messageView = ''; 375 for (let i = 0; i < uintArray.length; i++) { 376 messageView = String.fromCharCode(uintArray[i]); 377 } 378 console.log('total receive: ' + JSON.stringify(value)); 379 console.log('message information: ' + messageView); 380}); 381client.on('connect', () => { 382 console.log("on connect"); 383}); 384client.on('close', () => { 385 console.log("on close"); 386}); 387 388// 传入指定的本地套接字路径,连接服务端。 389let sandboxPath: string = getContext(this).filesDir + '/testSocket' 390let connectOpt: socket.LocalConnectOptions = { 391 address: { 392 address: sandboxPath 393 }, 394 timeout: 6000 395} 396let sendOpt: socket.LocalSendOptions = { 397 data: 'Hello world!' 398} 399client.connect(connectOpt).then(() => { 400 console.log('connect success') 401 client.send(sendOpt).then(() => { 402 console.log('send success') 403 }).catch((err: Object) => { 404 console.log('send failed: ' + JSON.stringify(err)) 405 }) 406}).catch((err: Object) => { 407 console.log('connect fail: ' + JSON.stringify(err)); 408}); 409 410// 当不需要再连接服务端,需要断开且取消事件的监听时 411client.off('message'); 412client.off('connect'); 413client.off('close'); 414client.close().then(() => { 415 console.log('close client success') 416}).catch((err: Object) => { 417 console.log('close client err: ' + JSON.stringify(err)) 418}) 419``` 420 421## 应用通过 Local Socket Server 进行数据传输 422 423### 开发步骤 424 425服务端 LocalSocket Server 流程: 426 4271. import 需要的 socket 模块。 428 4292. 使用 constructLocalSocketServerInstance 接口,创建一个 LocalSocketServer 服务端对象。 430 4313. 启动服务,绑定本地套接字路径,创建出本地套接字文件,监听客户端的连接请求。 432 4334. 注册 LocalSocket 的客户端连接(connect)事件,以及一些其它事件(可选)。 434 4355. 在客户端连接上来时,通过连接事件的回调函数,获取连接会话对象。 436 4376. 给会话对象 LocalSocketConnection 注册消息(message)事件,以及一些其它事件(可选)。 438 4397. 通过会话对象主动向客户端发送消息。 440 4418. 结束与客户端的通信,主动断开与客户端的连接。 442 4439. 取消 LocalSocketConnection 和 LocalSocketServer 相关事件的订阅。 444 445```ts 446import socket from '@ohos.net.socket'; 447// 创建一个LocalSocketServer连接,返回一个LocalSocketServer对象。 448let server = socket.constructLocalSocketServerInstance(); 449// 创建并绑定本地套接字文件testSocket,进行监听 450let sandboxPath: string = getContext(this).filesDir + '/testSocket' 451let listenAddr: socket.LocalAddress = { 452 address: sandboxPath 453} 454server.listen(listenAddr).then(() => { 455 console.log("listen success"); 456}).catch((err: Object) => { 457 console.log("listen fail: " + JSON.stringify(err)); 458}); 459 460// 订阅LocalSocketServer的connect事件 461server.on("connect", (connection: socket.LocalSocketConnection) => { 462 // 订阅LocalSocketConnection相关的事件 463 connection.on("error", (err) => { 464 console.log("on error success"); 465 }); 466 connection.on('message', (value: socket.LocalSocketMessageInfo) => { 467 const uintArray = new Uint8Array(value.message); 468 let messageView = ''; 469 for (let i = 0; i < uintArray.length; i++) { 470 messageView = String.fromCharCode(uintArray[i]); 471 } 472 console.log('total: ' + JSON.stringify(value)); 473 console.log('message information: ' + messageView); 474 }); 475 476 connection.on('error', (err) => { 477 console.log("err:" + JSON.stringify(err)); 478 }) 479 480 // 向客户端发送数据 481 let sendOpt : socket.LocalSendOptions = { 482 data: 'Hello world!' 483 }; 484 connection.send(sendOpt).then(() => { 485 console.log('send success'); 486 }).catch((err: Object) => { 487 console.log('send failed: ' + JSON.stringify(err)); 488 }) 489 490 // 关闭与客户端的连接 491 connection.close().then(() => { 492 console.log('close success'); 493 }).catch((err: Object) => { 494 console.log('close failed: ' + JSON.stringify(err)); 495 }); 496 497 // 取消LocalSocketConnection相关的事件订阅 498 connection.off('message'); 499 connection.off('error'); 500}); 501 502// 取消LocalSocketServer相关的事件订阅 503server.off('connect'); 504server.off('error'); 505``` 506 507## 应用通过 TLS Socket 进行加密数据传输 508 509### 开发步骤 510 511客户端 TLS Socket 流程: 512 5131. import 需要的 socket 模块。 514 5152. 绑定服务器 IP 和端口号。 516 5173. 双向认证上传客户端 CA 证书及数字证书;单向认证上传客户端 CA 证书。 518 5194. 创建一个 TLSSocket 连接,返回一个 TLSSocket 对象。 520 5215. (可选)订阅 TLSSocket 相关的订阅事件。 522 5236. 发送数据。 524 5257. TLSSocket 连接使用完毕后,主动关闭。 526 527```ts 528import socket from '@ohos.net.socket'; 529import { BusinessError } from '@ohos.base'; 530 531class SocketInfo { 532 message: ArrayBuffer = new ArrayBuffer(1); 533 remoteInfo: socket.SocketRemoteInfo = {} as socket.SocketRemoteInfo; 534} 535// 创建一个(双向认证)TLS Socket连接,返回一个TLS Socket对象。 536let tlsTwoWay = socket.constructTLSSocketInstance(); 537// 订阅TLS Socket相关的订阅事件 538tlsTwoWay.on('message', (value: SocketInfo) => { 539 console.log("on message"); 540 let buffer = value.message; 541 let dataView = new DataView(buffer); 542 let str = ""; 543 for (let i = 0; i < dataView.byteLength; ++i) { 544 str += String.fromCharCode(dataView.getUint8(i)); 545 } 546 console.log("on connect received:" + str); 547}); 548tlsTwoWay.on('connect', () => { 549 console.log("on connect"); 550}); 551tlsTwoWay.on('close', () => { 552 console.log("on close"); 553}); 554 555// 绑定本地IP地址和端口。 556let ipAddress : socket.NetAddress = {} as socket.NetAddress; 557ipAddress.address = "192.168.xxx.xxx"; 558ipAddress.port = 4512; 559tlsTwoWay.bind(ipAddress, (err: BusinessError) => { 560 if (err) { 561 console.log('bind fail'); 562 return; 563 } 564 console.log('bind success'); 565}); 566 567ipAddress.address = "192.168.xxx.xxx"; 568ipAddress.port = 1234; 569 570let tlsSecureOption : socket.TLSSecureOptions = {} as socket.TLSSecureOptions; 571tlsSecureOption.key = "xxxx"; 572tlsSecureOption.cert = "xxxx"; 573tlsSecureOption.ca = ["xxxx"]; 574tlsSecureOption.password = "xxxx"; 575tlsSecureOption.protocols = [socket.Protocol.TLSv12]; 576tlsSecureOption.useRemoteCipherPrefer = true; 577tlsSecureOption.signatureAlgorithms = "rsa_pss_rsae_sha256:ECDSA+SHA256"; 578tlsSecureOption.cipherSuite = "AES256-SHA256"; 579 580let tlsTwoWayConnectOption : socket.TLSConnectOptions = {} as socket.TLSConnectOptions; 581tlsSecureOption.key = "xxxx"; 582tlsTwoWayConnectOption.address = ipAddress; 583tlsTwoWayConnectOption.secureOptions = tlsSecureOption; 584tlsTwoWayConnectOption.ALPNProtocols = ["spdy/1", "http/1.1"]; 585 586// 建立连接 587tlsTwoWay.connect(tlsTwoWayConnectOption, () => { 588 console.error("connect function"); 589}); 590 591// 连接使用完毕后,主动关闭。取消相关事件的订阅。 592tlsTwoWay.close((err: BusinessError) => { 593 if (err) { 594 console.log("close callback error = " + err); 595 } else { 596 console.log("close success"); 597 } 598 tlsTwoWay.off('message'); 599 tlsTwoWay.off('connect'); 600 tlsTwoWay.off('close'); 601}); 602 603// 创建一个(单向认证)TLS Socket连接,返回一个TLS Socket对象。 604let tlsOneWay = socket.constructTLSSocketInstance(); // One way authentication 605 606// 订阅TLS Socket相关的订阅事件 607tlsTwoWay.on('message', (value: SocketInfo) => { 608 console.log("on message"); 609 let buffer = value.message; 610 let dataView = new DataView(buffer); 611 let str = ""; 612 for (let i = 0; i < dataView.byteLength; ++i) { 613 str += String.fromCharCode(dataView.getUint8(i)); 614 } 615 console.log("on connect received:" + str); 616}); 617tlsTwoWay.on('connect', () => { 618 console.log("on connect"); 619}); 620tlsTwoWay.on('close', () => { 621 console.log("on close"); 622}); 623 624// 绑定本地IP地址和端口。 625ipAddress.address = "192.168.xxx.xxx"; 626ipAddress.port = 5445; 627tlsOneWay.bind(ipAddress, (err:BusinessError) => { 628 if (err) { 629 console.log('bind fail'); 630 return; 631 } 632 console.log('bind success'); 633}); 634 635ipAddress.address = "192.168.xxx.xxx"; 636ipAddress.port = 8789; 637let tlsOneWaySecureOption : socket.TLSSecureOptions = {} as socket.TLSSecureOptions; 638tlsOneWaySecureOption.ca = ["xxxx", "xxxx"]; 639tlsOneWaySecureOption.cipherSuite = "AES256-SHA256"; 640 641let tlsOneWayConnectOptions: socket.TLSConnectOptions = {} as socket.TLSConnectOptions; 642tlsOneWayConnectOptions.address = ipAddress; 643tlsOneWayConnectOptions.secureOptions = tlsOneWaySecureOption; 644 645// 建立连接 646tlsOneWay.connect(tlsOneWayConnectOptions, () => { 647 console.error("connect function"); 648}); 649 650// 连接使用完毕后,主动关闭。取消相关事件的订阅。 651tlsTwoWay.close((err: BusinessError) => { 652 if (err) { 653 console.log("close callback error = " + err); 654 } else { 655 console.log("close success"); 656 } 657 tlsTwoWay.off('message'); 658 tlsTwoWay.off('connect'); 659 tlsTwoWay.off('close'); 660}); 661``` 662 663## 应用通过 TLS Socket Server 进行加密数据传输 664 665### 开发步骤 666 667服务端 TLS Socket Server 流程: 668 6691. import 需要的 socket 模块。 670 6712. 启动服务,绑定 IP 和端口号,监听客户端连接,创建并初始化 TLS 会话,加载证书密钥并验证。 672 6733. 订阅 TLSSocketServer 的连接事件。 674 6754. 收到客户端连接,通过回调得到 TLSSocketConnection 对象。 676 6775. 订阅 TLSSocketConnection 相关的事件。 678 6796. 发送数据。 680 6817. TLSSocketConnection 连接使用完毕后,断开连接。 682 6838. 取消订阅 TLSSocketConnection 以及 TLSSocketServer 的相关事件。 684 685```ts 686import socket from "@ohos.net.socket"; 687import { BusinessError } from '@ohos.base'; 688let tlsServer: socket.TLSSocketServer = socket.constructTLSSocketServerInstance(); 689let tlsConnectOptions: socket.TLSConnectOptions = { 690 address: { 691 address: '192.168.xx.xxx', 692 port: 8080 693 }, 694 secureOptions: { 695 key: "xxxx", 696 cert: "xxxx", 697 ca: ["xxxx"], 698 password: "xxxx", 699 protocols: socket.Protocol.TLSv12, 700 useRemoteCipherPrefer: true, 701 signatureAlgorithms: "rsa_pss_rsae_sha256:ECDSA+SHA256", 702 cipherSuite: "AES256-SHA256" 703 }, 704 ALPNProtocols: ["spdy/1", "http/1.1"] 705} 706tlsServer.listen(tlsConnectOptions).then(() => { 707 console.log("listen callback success"); 708}).catch((err: BusinessError) => { 709 console.log("failed" + err); 710}); 711 712class SocketInfo { 713 message: ArrayBuffer = new ArrayBuffer(1); 714 remoteInfo: socket.SocketRemoteInfo = {} as socket.SocketRemoteInfo; 715} 716let callback = (value: SocketInfo) => { 717 let messageView = ''; 718 for (let i: number = 0; i < value.message.byteLength; i++) { 719 let uint8Array = new Uint8Array(value.message) 720 let messages = uint8Array[i] 721 let message = String.fromCharCode(messages); 722 messageView += message; 723 } 724 console.log('on message message: ' + JSON.stringify(messageView)); 725 console.log('remoteInfo: ' + JSON.stringify(value.remoteInfo)); 726} 727tlsServer.on('connect', (client: socket.TLSSocketConnection) => { 728 client.on('message', callback); 729 730 // 发送数据 731 client.send('Hello, client!').then(() => { 732 console.log('send success'); 733 }).catch((err: BusinessError) => { 734 console.log('send fail'); 735 }); 736 737 // 断开连接 738 client.close().then(() => { 739 console.log('close success'); 740 }).catch((err: BusinessError) => { 741 console.log('close fail'); 742 }); 743 744 // 可以指定传入on中的callback取消一个订阅,也可以不指定callback清空所有订阅。 745 client.off('message', callback); 746 client.off('message'); 747}); 748 749// 取消订阅tlsServer的相关事件 750tlsServer.off('connect'); 751``` 752 753## 相关实例 754 755针对 Socket 连接开发,有以下相关实例可供参考: 756 757- [网络管理-Socket 连接(ArkTS)(API9)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Connectivity/Socket) 758