socket-connection.md 4.0 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 68 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
# 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))
       }
       console.log("on connect recevied:" + str)
   });
   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)