简介

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主从复制原理-binlog

    0.为什么需要主从复制? 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出 ...

  2. ThinkPHP6 事件的简单应用

    一.序章 ThinkPHP6的手册中关于[事件]章节的介绍都是直接文字说明,给出创建的类文件,并没有一个好的示例来进行补充说明.对于刚接触[事件]的同学在阅读理解上增加了一点点困难,本文就在此结合示例 ...

  3. Java面向对象(下)--static/final/代码块/抽象/接口/内部类

    目录 1 关键字:static 2 理解main方法的语法 3 类的成员之四:代码块 4关键字:final 5 抽象类与抽象方法 6 接口(interface) 7 类的成员之五:内部类 static ...

  4. tag 转 分支 branch

    获得最新 git fetch origin 获取tag git tag tag 转 branch git branch newbranch vtest.1.0.FINAL --- git branch ...

  5. 关于Jitpack发布aar,会丢失内置依赖库问题

    原文:关于Jitpack发布aar,会丢失内置依赖库问题 | Stars-One的杂货小窝 关于发布aar出现的一个大坑排查,折腾了两天,终于是找到了解决方案 问题描述 有这样的一个情况,我新建了个A ...

  6. websocket服务器的创建

    就这上篇文章的代码,我们会继续实现以下websocket的协议. 为什么要使用websocket呢? 它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平 ...

  7. 使用Wireshark在RTP流中提取中264数据(针对udp)(转)

    调试rtsp收发流时,经常会需要抓包以确认是网络问题还是程序问题还是其它问题.通过tcpdump或者wireshark抓到的包通常是rtp流,保存为.pcap格式文件后中,可通过wireshark进行 ...

  8. 大端(big endian) 小端(little endian) --- 在多字节存储 和 多字节通信中的含义(我还是太年轻了)

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

  9. 什么是XR扩展现实,XR云串流平台有哪些

    什么是云XR (AR/VR/MR/SR) 虚拟现实(VR),传统的实现方式是通过计算机模拟虚拟环境,从而给人一种环境沉浸感.与传统视频相比,VR带来了前所未有的沉浸式体验. 增强现实(AR)是一种无缝 ...

  10. PHP 数据库表单创建方法记录(储存三方接口数据必用)

    最近项目在对接第三方接口数据,这里分享下我用来偷懒的一个PHP方法: /** * 数据库表单创建方法 * @return string * @throws \Exception */ public f ...