简介

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

  

HarmonyOS网络管理开发—Socket连接的更多相关文章

  1. 转 Cocos网络篇[3.2](3) ——Socket连接(1)

    Cocos网络篇[3.2](3) ——Socket连接(1) 2015-03-05 22:24:13 标签:network http socket cocos [唠叨] 在客户端游戏开发中,使用HTT ...

  2. 网络编程-socket(三)(TCP长连接和UDP短连接、时间服务器)

    详解地址:https://www.cnblogs.com/mys6/p/10587673.html TCP server端 import socketsk = socket.socket() # 创建 ...

  3. 网络编程 - socket实现多个连接处理

    #服务端import socket,osso_server=socket.socket()so_server.bind(("localhost",6969))so_server.l ...

  4. Python 网络编程 C/S建立Socket连接

    分为客户端和服务端 服务端 server.py 客户端 1 #coding=utf-8 2 import socket 3 4 client = socket.socket() #生成socket连接 ...

  5. 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制

    安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制 socket 连接采用流的方式进行发送接收数据,采用thread线程的方式. 什么是线程?  详细代码介 ...

  6. 比较 http连接 vs socket连接

    http连接 :短连接,客户端,服务器三次握手建立连接,服务器响应返回信息,连接关闭,一次性的socket连接:长连接,客户端,服务器三次握手建立连接不中断(通过ip地址端口号定位进程)及时通讯,客户 ...

  7. UrlConnection连接和Socket连接的区别

    关于UrlConnection连接和Socket连接的区别,只知道其中的原理如下: 抽象一点的说,Socket只是一个供上层调用的抽象接口,隐躲了传输层协议的细节. urlconnection 基于H ...

  8. 网络编程socket基本API详解(转)

    网络编程socket基本API详解   socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...

  9. java网络编程socket解析

    转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...

  10. Android 网络编程 Socket

    1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...

随机推荐

  1. Python实现ARP攻击

    目录 概述 ARP协议 IP转MAC 结构 ARP扫描 开始欺骗 中间人 其他 ARP老化 防御 windows linux 概述 高中的时候,学校有一个商店,会放开WIFI给偷偷带手机去学校的我们使 ...

  2. FolkMQ 作个简单的消息中间件(最简单的那种), v1.3.1 发布

    功能简介 角色 功能 生产端(或发起端) 发布消息.定时消息(或叫延时).顺序消息.可过期消息.事务消息.发送消息(rpc)支持 Qos0.Qos1 消费端(或接收端) 订阅.取消订阅.消费-ACK( ...

  3. Swoft - Bean

    一.Bean 在 Swoft 中,一个 Bean 就是一个类的一个对象实例. 它(Bean)是通过容器来存放和管理整个生命周期的. 最直观的感受就是省去了频繁new的过程,节省了资源的开销. 二.Be ...

  4. 图数据库基准测试 LDBC SNB 系列讲解:Schema 和数据生成的机制

    LDBC(Linked Data Benchmark Council)Social Network Benchmark,简称 LDBC SNB,是一种针对社交网络场景的评估图数据库性能的基准测试. L ...

  5. vue 打包 可以加 --watch 持续打包 - 开发本地应用程序 - 套壳模式开发

    vue 打包 可以加 --watch 持续打包 - 开发本地应用程序 - 套壳模式开发 "watch": "vue-cli-service build --watch - ...

  6. android ndk生成第三方库的so方法(ndk-build,Application.mk,Android.mk)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  7. find、grep、sed、awk命令(总结)

    find.grep.sed.awk命令(总结) 大纲 *一.常见系统特殊符号* *(一)基础符号系列* *1)美元符号 $* *2)叹号符号 !* *3)竖线符号 |* *4)井号符号 #* *(二) ...

  8. 智慧公安!3DCAT实时云渲染助力某公安机关打造数字孪生可视化系统

    近年来,随着大数据.数字孪生.云计算.人工智能等技术的飞速发展,数字化浪潮席卷全国各地公安系统.2022年全国公安工作会议中也提到,数字化改革是推动公安工作创新发展的大引擎.培育战斗力生成新的增长点. ...

  9. 基于C#的自动校时器 - 开源研究系列文章

    上次在公司的Windows7电脑上操作系统没有自动进行校时,导致系统时间老是快那么几分钟,于是想到了用C#开发一个系统时间自动校时器.这个应用不难,主要是能够校时那个操作类的问题. 1. 项目目录: ...

  10. JS(运算符、流程控制)

    一 运算符(操作符) 1 运算符的分类 运算符(operator)也被称为操作符,是用于实现赋值.比较和执行算数运算等功能的符号. JavaScript中常用的运算符有: 算数运算符 递增和递减运算符 ...