首页 > 其他分享 >HarmonyOS网络管理开发—Socket连接

HarmonyOS网络管理开发—Socket连接

时间:2023-10-09 17:24:52浏览次数:41  
标签:console Socket 网络管理 HarmonyOS connect close 连接 log

 

简介

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 =newDataView(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');
});

  

标签:console,Socket,网络管理,HarmonyOS,connect,close,连接,log
From: https://www.cnblogs.com/HarmonyOSDev/p/17735370.html

相关文章

  • HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Stack
    堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。该组件从APIVersion7开始支持。可以包含子组件。一、接口Stack(value?:{alignContent?:Alignment})从APIversion9开始,该接口支持在ArkTS卡片中使用。二、属性除支持通用属性外,还支持以下属性:三、示例//xxx.e......
  • 网络管理命令1
    一:概述LInux系统中有很多的网络管理命令,比如ip命令。利用网络管理命令我们可以有效的管理网络,当网络出现故障时可以通过这些网络有效的诊断出问题原因。二:ip命令实现网络管理首先来说一下net-tools和iproute这两个工具。早先在Linux系统管理员进行网络配置时主要使用net-tools管理......
  • 检查一个Socket是否可连接
    //检查一个Socket是否可连接privateboolIsSocketConnected(Socketclient){boolblockingState=client.Blocking;try{byte[]tmp=newbyte[1];client.Blocking=fals......
  • HarmonyOS应用窗口管理(Stage模型)
     一、 窗口开发概述窗口模块的定义窗口模块用于在同一块物理屏幕上,提供多个应用界面显示、交互的机制。● 对应用开发者而言,窗口模块提供了界面显示和交互能力。● 对终端用户而言,窗口模块提供了控制应用界面的方式。● 对整个操作系统而言,窗口模块提供了不同应用界......
  • springboot整合websocket
    引入依赖<!--webSocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>配置类/***websocket配置类*/@ConfigurationpublicclassWebS......
  • Python TCP socket
    Python TCPsocketsocket.listen(n)简单来说,这里的nt表示socket的”排队个数“一般情况下,一个进程只有一个主线程(也就是单线程),那么socket允许的最大连接数为:n+1如果服务器是多线程,比如上面的代码例子是开了2个线程,那么socket允许的最大连接数就是:n+2换句话说:排队的......
  • TCP Socket 数据发送和接收时进制转换
       确实经过了转换:十六进制--》十进制--》ASCII字符十六进制的61,对应十进制的97,对应ASCII字符a https://blog.csdn.net/cybersnow/article/details/88079026C#代码://16进制字符串转字节数组  格式为stringsendMessage="000100000006FF0500640......
  • Python使用socket的UDP协议实现FTP文件服务
    简介本示例主要是用Python的socket,使用UDP协议实现一个FTP服务端、FTP客户端,用来实现文件的传输。在公司内网下,可以不适用U盘的情况下,纯粹使用网络,来实现文件服务器的搭建,进而实现文件的网络传输。同时用来理解Python的socket使用。服务端运行起来后,会把服务器上面的指......
  • socket编程零碎知识点
    1.socket常用类型流格式套接字流格式套接字(StreamSockets)也叫“面向连接的套接字”,在代码中使用SOCK_STREAM表示。数据报格式套接字数据报格式套接字(DatagramSockets)也叫“无连接的套接字”,在代码中使用SOCK_DGRAM表示。2.目前学习常用链接http://c.biancheng.net/vi......
  • socket API
    在Linux下,套接字编程(SocketProgramming)涉及多个系统调用和库函数来创建、配置和管理套接字。以下是一些常用的套接字相关的API:socket():创建套接字,返回一个套接字描述符。bind():将套接字与特定的IP地址和端口号关联。listen():将套接字设置为监听状态,用于接受连接请求。......