socket-connection.md 4.3 KB
Newer Older
Z
zengyawen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
# Socket连接


## 场景介绍

应用通过Socket进行数据传输,支持TCP和UDP两种协议。


## 接口说明

Socket连接主要由socket模块提供。具体接口说明如下表。

| 接口名 | 功能描述 |
| -------- | -------- |
| constructUDPSocketInstance() | 创建一个UDPSocket对象。 |
| constructTCPSocketInstance() | 创建一个TCPSocket对象。 |
| bind() | 绑定IP地址和端口。 |
| send() | 发送数据。 |
| close() | 关闭连接。 |
| getState() | 获取Socket状态。 |
| connect() | 连接到指定的IP地址和端口(仅TCP支持) |
| getRemoteAddress() | 获取对端Socket地址(仅TCP支持,需要先调用connect方法) |
| on(type: 'message') | 订阅Socket连接的接收消息事件。 |
| off(type: 'message') | 取消订阅Socket连接的接收消息事件。 |
| on(type: 'close') | 订阅Socket连接的关闭事件。 |
| off(type: 'close') | 取消订阅Socket连接的关闭事件。 |
| on(type: 'error') | 订阅Socket连接的Error事件。 |
| off(type: 'error') | 取消订阅Socket连接的Error事件。 |
| on(type: 'listening') | 订阅UDPSocket连接的数据包消息事件(仅UDP支持)。 |
| off(type: 'listening') | 取消订阅UDPSocket连接的数据包消息事件(仅UDP支持)。 |
| on(type: 'connect') | 订阅TCPSocket的连接事件(仅TCP支持)。 |
| off(type: 'connect') | 取消订阅TCPSocket的连接事件(仅TCP支持)。 |


## 开发步骤

UDP与TCP流程大体类似,下面以TCP为例:

1. import需要的socket模块。

2. 创建一个TCPSocket连接,返回一个TCPSocket对象。

3. (可选)订阅TCPSocket相关的订阅事件。

4. 绑定IP地址和端口,端口可以指定或由系统随机分配。

5. 连接到指定的IP地址和端口。

6. 发送数据。

7. Socket连接使用完毕后,主动关闭。
   
   ```js
   import socket from '@ohos.net.socket'
   
   // 创建一个TCPSocket连接,返回一个TCPSocket对象。
   let tcp = socket.constructTCPSocketInstance();
   
   // 订阅TCPSocket相关的订阅事件
   tcp.on('message', value => {
       console.log("on message")
       let buffer = value.message
       let dataView = new DataView(buffer)
       let str = ""
       for (let i = 0;i < dataView.byteLength; ++i) {
           str += String.fromCharCode(dataView.getUint8(i))
       }
Q
qingdao@qing 已提交
68
       console.log("on connect received:" + str)
Z
zengyawen 已提交
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
   });
   tcp.on('connect', () => {
       console.log("on connect")
   });
   tcp.on('close', () => {
       console.log("on close")
   });
   
   // 绑定IP地址和端口。
   let bindAddress = {
       address: '192.168.xx.xx',
       port: 1234, // 绑定端口,如1234
       family: 1
   };
   tcp.bind(bindAddress, err => {
       if (err) {
           console.log('bind fail');
           return;
       }
       console.log('bind success');
       // 连接到指定的IP地址和端口。
       let connectAddress = {
           address: '192.168.xx.xx',
           port: 5678, // 连接端口,如5678
           family: 1
       };
       tcp.connect({
           address: connectAddress, timeout: 6000
       }, err => {
           if (err) {
               console.log('connect fail');
               return;
           }
           console.log('connect success');
           // 发送数据
           tcp.send({
               data: 'Hello, server!'
           }, err => {
               if (err) {
                   console.log('send fail');
                   return;
               }
               console.log('send success');
           })
       });
   });
   // 连接使用完毕后,主动关闭。取消相关事件的订阅。
   setTimeout(() => {
       tcp.close((err) => {
           console.log('close socket.')
       });
       tcp.off('message');
       tcp.off('connect');
       tcp.off('close');
   }, 30 * 1000);
   ```
Z
zengyawen 已提交
125 126 127 128

## 相关实例
针对Socket连接开发,有以下相关实例可供参考:
- [`Socket`:Socket 连接(eTS)(API8)](https://gitee.com/openharmony/app_samples/tree/master/Network/Socket)
129 130
- [使用UDP实现与服务端通信(eTS)(API9)](https://gitee.com/openharmony/codelabs/tree/master/NetworkManagement/UdpDemoOH)
- [使用TCP实现与服务端通信(eTS)(API9)](https://gitee.com/openharmony/codelabs/tree/master/NetworkManagement/TcpSocketDemo)