简介

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. Mysql常用存储引擎以及区别?

    InnoDB:是Mysql的默认存储引擎,支持事务.外键.如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新.删除操作,那么InnoDB存 ...

  2. CTF中常见编码

    ASCII编码 ASCII HEX DEC flag{hello_ctfer} 66 6c 61 67 7b 68 65 6c 6c 6f 5f 63 74 66 65 72 7d 102 108 9 ...

  3. python 打包 exe文件

    操作步骤: 先安装pyinstaller,在终端中输入pip install pyinstaller即可. 打包程序: pyinstaller --console --onefile 7.py 在di ...

  4. Django 初步使用

    Django 框架系列 目录 Django 框架系列 一. 安装启用 1.1 主流web框架概述 1.2 安装版本 1.3 启动的两种方式 1)命令行创建 2)pycharm创建 3)两种方式的区别 ...

  5. 候捷-C++程序设计(Ⅱ)兼谈对象模型

    目录 笔记参考 学习目标 转换函数与explicit pointer-like classes function-like classes 模板template 模板特化与偏特化 模板模板参数 引用( ...

  6. Prompt进阶2:LangGPT(构建高性能Prompt策略和技巧)--最佳实践指南

    Prompt进阶2:LangGPT(构建高性能Prompt策略和技巧)--最佳实践指南 0.前言 左图右图 prompt 基本是一样的,差别只在提示工程这个词是否用中英文表达.我们看到,一词之差,回答 ...

  7. Android WebView获取html源码

    通过执行js语句来获取 val code = """ document.documentElement.outerHTML """.trim ...

  8. [LeetCode] 5933. k 镜像数字的和

    一.摘要 本文介绍了一种通过模拟寻找十进制镜像数字,然后判断其对应的k进制表示是否也是镜像的方法.具体来讲即从小到大遍历10进制的镜像数字,然后对10进制镜像数字转为k进制,然后判断转为k进制后是否还 ...

  9. uni之this作用域

    目录介绍 01.先看一个案例 02.看一下解决方案 01.先看一个案例 代码如下所示 发现了点击按钮1可以更新title内容,但是点击按钮2却无法更新title内容.这个究竟是为什么呢? <te ...

  10. 三维模型3DTile格式轻量化压缩处理重难点分析

    三维模型3DTile格式轻量化压缩处理重难点分析 在对三维模型3DTile格式进行轻量化压缩处理的过程中,存在一些重要而又困难的问题需要解决.以下是几个主要的重难点: 1.压缩率和模型质量之间的平衡: ...