HarmonyOS网络管理开发—Socket连接
简介
Socket连接主要是通过Socket进行数据传输,支持TCP/UDP/TLS协议。
基本概念
● Socket:套接字,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
● TCP:传输控制协议(Transmission Control Protocol)。是一种面向连接的、可靠的、基于字节流的传输层通信协议。
● UDP:用户数据报协议协议(User Datagram Protocol)。是一个简单的面向消息的传输层,不需要连接。
● TLS:安全传输层协议(Transport Layer Security)。用于在两个通信应用程序之间提供保密性和数据完整性。
场景介绍
应用通过Socket进行数据传输,支持TCP/UDP/TLS协议。主要场景有:
● 应用通过TCP/UDP Socket进行数据传输
● 应用通过TLS Socket进行加密数据传输
接口说明
完整的JS API说明以及实例代码请参考:Socket连接。
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支持)。 |
TLS Socket连接主要由tls_socket模块提供。具体接口说明如下表。
接口名 | 功能描述 |
---|---|
constructTLSSocketInstance() | 创建一个TLSSocket对象。 |
bind() | 绑定IP地址和端口号。 |
close(type: 'error') | 关闭连接。 |
connect() | 连接到指定的IP地址和端口。 |
getCertificate() | 返回表示本地证书的对象。 |
getCipherSuite() | 返回包含协商的密码套件信息的列表。 |
getProtocol() | 返回包含当前连接协商的SSL/TLS协议版本的字符串。 |
getRemoteAddress() | 获取TLSSocket连接的对端地址。 |
getRemoteCertificate() | 返回表示对等证书的对象。 |
getSignatureAlgorithms() | 在服务器和客户端之间共享的签名算法列表,按优先级降序排列。 |
getState() | 获取TLSSocket连接的状态。 |
off(type: 'close') | 取消订阅TLSSocket连接的关闭事件。 |
off(type: 'error') | 取消订阅TLSSocket连接的Error事件。 |
off(type: 'message') | 取消订阅TLSSocket连接的接收消息事件。 |
on(type: 'close') | 订阅TLSSocket连接的关闭事件。 |
on(type: 'error') | 订阅TLSSocket连接的Error事件。 |
on(type: 'message') | 订阅TLSSocket连接的接收消息事件。 |
send() | 发送数据。 |
setExtraOptions() | 设置TLSSocket连接的其他属性。 |
应用TCP/UDP协议进行通信
UDP与TCP流程大体类似,下面以TCP为例:
1. import需要的socket模块。
2. 创建一个TCPSocket连接,返回一个TCPSocket对象。
3. (可选)订阅TCPSocket相关的订阅事件。
4. 绑定IP地址和端口,端口可以指定或由系统随机分配。
5. 连接到指定的IP地址和端口。
6. 发送数据。
7. Socket连接使用完毕后,主动关闭。
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 received:" + 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);
应用通过TLS Socket进行加密数据传输
开发步骤
客户端TLS Socket流程:
1. import需要的socket模块。
2. 绑定服务器IP和端口号。
3. 双向认证上传客户端CA证书及数字证书;单向认证上传客户端CA证书。
4. 创建一个TLSSocket连接,返回一个TLSSocket对象。
5. (可选)订阅TLSSocket相关的订阅事件。
6. 发送数据。
7. TLSSocket连接使用完毕后,主动关闭。
import socket from '@ohos.net.socket' // 创建一个(双向认证)TLS Socket连接,返回一个TLS Socket对象。 let tlsTwoWay = socket.constructTLSSocketInstance(); // 订阅TLS Socket相关的订阅事件 tlsTwoWay.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 received:" + str) }); tlsTwoWay.on('connect', () => { console.log("on connect") }); tlsTwoWay.on('close', () => { console.log("on close") }); // 绑定本地IP地址和端口。 tlsTwoWay.bind({ address: '192.168.xxx.xxx', port: xxxx, family: 1 }, err => { if (err) { console.log('bind fail'); return; } console.log('bind success'); }); // 设置通信过程中使用参数 let options = { ALPNProtocols: ["spdy/1", "http/1.1"], // 连接到指定的IP地址和端口。 address: { address: "192.168.xx.xxx", port: xxxx, // 端口 family: 1, }, // 设置用于通信过程中完成校验的参数。 secureOptions: { key: "xxxx", // 密钥 cert: "xxxx", // 数字证书 ca: ["xxxx"], // CA证书 passwd: "xxxx", // 生成密钥时的密码 protocols: [socket.Protocol.TLSv12], // 通信协议 useRemoteCipherPrefer: true, // 是否优先使用对端密码套件 signatureAlgorithms: "rsa_pss_rsae_sha256:ECDSA+SHA256", // 签名算法 cipherSuite: "AES256-SHA256", // 密码套件 }, }; // 建立连接 tlsTwoWay.connect(options, (err, data) => { console.error(err); console.log(data); }); // 连接使用完毕后,主动关闭。取消相关事件的订阅。 tlsTwoWay.close((err) => { if (err) { console.log("close callback error = " + err); } else { console.log("close success"); } tlsTwoWay.off('message'); tlsTwoWay.off('connect'); tlsTwoWay.off('close'); }); // 创建一个(单向认证)TLS Socket连接,返回一个TLS Socket对象。 let tlsOneWay = socket.constructTLSSocketInstance(); // One way authentication // 订阅TLS Socket相关的订阅事件 tlsTwoWay.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 received:" + str) }); tlsTwoWay.on('connect', () => { console.log("on connect") }); tlsTwoWay.on('close', () => { console.log("on close") }); // 绑定本地IP地址和端口。 tlsOneWay.bind({ address: '192.168.xxx.xxx', port: xxxx, family: 1 }, err => { if (err) { console.log('bind fail'); return; } console.log('bind success'); }); // 设置通信过程中使用参数 let oneWayOptions = { address: { address: "192.168.xxx.xxx", port: xxxx, family: 1, }, secureOptions: { ca: ["xxxx","xxxx"], // CA证书 cipherSuite: "AES256-SHA256", // 密码套件 }, }; // 建立连接 tlsOneWay.connect(oneWayOptions, (err, data) => { console.error(err); console.log(data); }); // 连接使用完毕后,主动关闭。取消相关事件的订阅。 tlsTwoWay.close((err) => { if (err) { console.log("close callback error = " + err); } else { console.log("close success"); } tlsTwoWay.off('message'); tlsTwoWay.off('connect'); tlsTwoWay.off('close'); });
本文由博客一文多发平台 OpenWrite 发布!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
首个图文混合创作大模型“书生·浦语灵笔”开源
上海人工智能实验室(上海 AI 实验室)宣布推出首个图文混合创作大模型书生·浦语灵笔(InternLM-XComposer,简称“浦语灵笔”),依托强大的多模态性能,解锁“一键生成”图文混合文章的创作能力,为大模型落地应用提供更多可能。 目前,浦语灵笔已开源其中的智能创作和对话(InternLM-XComposer-7B)及多任务预训练(InternLM-XComposer-VL-7B)版本,并提供免费商用。 此前,上海AI实验室曾陆续开源了书生·浦语大语言模型的7B(InterLM-7B)及20B(InternLM-20B)版本。基于书生·浦语大语言模型(InternLM),浦语灵笔接受视觉和语言模态输入,不仅在图文对话方面表现优秀,更具备图文并茂文章的“一键生成”能力。 浦语灵笔能够进行流利的中英文图文对话,准确理解图像内容;并解锁了图文并茂文章创作的全新能力。除自动配图能力外,浦语灵笔还提供了配图推荐和更换功能,根据用户实际需求定制图文内容。 目前,浦语灵笔已支持科普文稿、营销广告、新闻稿件、影视评论、生活指南等类型文章的图文并茂生成,并将逐渐开放更多能力。 浦语灵笔为图文文章创...
- 下一篇
OpenHarmony后代组件双向同步,跨层级传递:@Provide装饰器和@Consume装饰器
OpenHarmony后代组件双向同步,跨层级传递:@Provide装饰器和@Consume装饰器 @Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,@Provide和@Consume摆脱参数传递机制的束缚,实现跨层级传递。 其中@Provide装饰的变量是在祖先节点中,可以理解为被“提供”给后代的状态变量。@Consume装饰的变量是在后代组件中,去“消费(绑定)”祖先节点提供的变量。 说明: 从API version 9开始,这两个装饰器支持在ArkTS卡片中使用。 概述 @Provide/@Consume装饰的状态变量有以下特性: ● @Provide装饰的状态变量自动对其所有后代组件可用,即该变量被“provide”给他的后代组件。由此可见,@Provide的方便之处在于,开发者不需要多次在组件之间传递变量。 ● 后代通过使用@Consume去获取@Provide提供的变量,建立在@Provide和@Consume之间的双向数据同步,与@State/@Link不同...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启