• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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