0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS 網(wǎng)絡(luò)管理開發(fā) —Socket 連接

王程 ? 來(lái)源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-18 09:20 ? 次閱讀

簡(jiǎn)介

Socket 連接主要是通過(guò) Socket 進(jìn)行數(shù)據(jù)傳輸,支持 TCP/UDP/TLS 協(xié)議。

基本概念

? ● Socket:套接字,就是對(duì)網(wǎng)絡(luò)中不同主機(jī)上的應(yīng)用進(jìn)程之間進(jìn)行雙向通信的端點(diǎn)的抽象。

? ● TCP:傳輸控制協(xié)議 (Transmission Control Protocol)。是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。

? ● UDP:用戶數(shù)據(jù)報(bào)協(xié)議協(xié)議 (User Datagram Protocol)。是一個(gè)簡(jiǎn)單的面向消息的傳輸層,不需要連接。

? ● TLS:安全傳輸層協(xié)議 (Transport Layer Security)。用于在兩個(gè)通信應(yīng)用程序之間提供保密性和數(shù)據(jù)完整性。

場(chǎng)景介紹

應(yīng)用通過(guò) Socket 進(jìn)行數(shù)據(jù)傳輸,支持 TCP/UDP/TLS 協(xié)議。主要場(chǎng)景有:

? ● 應(yīng)用通過(guò) TCP/UDP Socket 進(jìn)行數(shù)據(jù)傳輸

? ● 應(yīng)用通過(guò) TLS Socket 進(jìn)行加密數(shù)據(jù)傳輸

接口說(shuō)明

完整的 JS API 說(shuō)明以及實(shí)例代碼請(qǐng)參考:Socket 連接。

Socket 連接主要由 socket 模塊提供。具體接口說(shuō)明如下表。

接口名 功能描述
constructUDPSocketInstance() 創(chuàng)建一個(gè) UDPSocket 對(duì)象。
constructTCPSocketInstance() 創(chuàng)建一個(gè) TCPSocket 對(duì)象。
bind() 綁定 IP 地址和端口。
send() 發(fā)送數(shù)據(jù)。
close() 關(guān)閉連接。
getState() 獲取 Socket 狀態(tài)。
connect() 連接到指定的 IP 地址和端口(僅 TCP 支持)
getRemoteAddress() 獲取對(duì)端 Socket 地址(僅 TCP 支持,需要先調(diào)用 connect 方法)
on(type: ‘message’) 訂閱 Socket 連接的接收消息事件。
off(type: ‘message’) 取消訂閱 Socket 連接的接收消息事件。
on(type: ‘close’) 訂閱 Socket 連接的關(guān)閉事件。
off(type: ‘close’) 取消訂閱 Socket 連接的關(guān)閉事件。
on(type: ‘error’) 訂閱 Socket 連接的 Error 事件。
off(type: ‘error’) 取消訂閱 Socket 連接的 Error 事件。
on(type: ‘listening’) 訂閱 UDPSocket 連接的數(shù)據(jù)包消息事件(僅 UDP 支持)。
off(type: ‘listening’) 取消訂閱 UDPSocket 連接的數(shù)據(jù)包消息事件(僅 UDP 支持)。
on(type: ‘connect’) 訂閱 TCPSocket 的連接事件(僅 TCP 支持)。
off(type: ‘connect’) 取消訂閱 TCPSocket 的連接事件(僅 TCP 支持)。

TLS Socket 連接主要由 tls_socket 模塊提供。具體接口說(shuō)明如下表。

接口名 功能描述
constructTLSSocketInstance() 創(chuàng)建一個(gè) TLSSocket 對(duì)象。
bind() 綁定 IP 地址和端口號(hào)。
close(type: ‘error’) 關(guān)閉連接。
connect() 連接到指定的 IP 地址和端口。
getCertificate() 返回表示本地證書的對(duì)象。
getCipherSuite() 返回包含協(xié)商的密碼套件信息的列表。
getProtocol() 返回包含當(dāng)前連接協(xié)商的 SSL/TLS 協(xié)議版本的字符串。
getRemoteAddress() 獲取 TLSSocket 連接的對(duì)端地址。
getRemoteCertificate() 返回表示對(duì)等證書的對(duì)象。
getSignatureAlgorithms() 在服務(wù)器和客戶端之間共享的簽名算法列表,按優(yōu)先級(jí)降序排列。
getState() 獲取 TLSSocket 連接的狀態(tài)。
off(type: ‘close’) 取消訂閱 TLSSocket 連接的關(guān)閉事件。
off(type: ‘error’) 取消訂閱 TLSSocket 連接的 Error 事件。
off(type: ‘message’) 取消訂閱 TLSSocket 連接的接收消息事件。
on(type: ‘close’) 訂閱 TLSSocket 連接的關(guān)閉事件。
on(type: ‘error’) 訂閱 TLSSocket 連接的 Error 事件。
on(type: ‘message’) 訂閱 TLSSocket 連接的接收消息事件。
send() 發(fā)送數(shù)據(jù)。
setExtraOptions() 設(shè)置 TLSSocket 連接的其他屬性。

應(yīng)用 TCP/UDP 協(xié)議進(jìn)行通信

UDP 與 TCP 流程大體類似,下面以 TCP 為例:

? 1. import 需要的 socket 模塊。

? 2. 創(chuàng)建一個(gè) TCPSocket 連接,返回一個(gè) TCPSocket 對(duì)象。

? 3. (可選)訂閱 TCPSocket 相關(guān)的訂閱事件。

? 4. 綁定 IP 地址和端口,端口可以指定或由系統(tǒng)隨機(jī)分配。

? 5. 連接到指定的 IP 地址和端口。

? 6. 發(fā)送數(shù)據(jù)。

? 7. Socket 連接使用完畢后,主動(dòng)關(guān)閉。

import socket from '@ohos.net.socket'

// 創(chuàng)建一個(gè)TCPSocket連接,返回一個(gè)TCPSocket對(duì)象。
let tcp = socket.constructTCPSocketInstance();

// 訂閱TCPSocket相關(guān)的訂閱事件
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');
    // 發(fā)送數(shù)據(jù)
    tcp.send({
      data: 'Hello, server!'
    }, err => {
      if (err) {
        console.log('send fail');
        return;
      }
      console.log('send success');
    })
  });
});
// 連接使用完畢后,主動(dòng)關(guān)閉。取消相關(guān)事件的訂閱。
setTimeout(() => {
  tcp.close((err) => {
    console.log('close socket.')
  });
  tcp.off('message');
  tcp.off('connect');
  tcp.off('close');
}, 30 * 1000);

應(yīng)用通過(guò) TLS Socket 進(jìn)行加密數(shù)據(jù)傳輸

開發(fā)步驟

客戶端 TLS Socket 流程:

? 1. import 需要的 socket 模塊。

? 2. 綁定服務(wù)器 IP 和端口號(hào)。

? 3. 雙向認(rèn)證上傳客戶端 CA 證書及數(shù)字證書;單向認(rèn)證上傳客戶端 CA 證書。

? 4. 創(chuàng)建一個(gè) TLSSocket 連接,返回一個(gè) TLSSocket 對(duì)象。

? 5. (可選)訂閱 TLSSocket 相關(guān)的訂閱事件。

? 6. 發(fā)送數(shù)據(jù)。

? 7. TLSSocket 連接使用完畢后,主動(dòng)關(guān)閉。

 import socket from '@ohos.net.socket'

   // 創(chuàng)建一個(gè)(雙向認(rèn)證)TLS Socket連接,返回一個(gè)TLS Socket對(duì)象。
   let tlsTwoWay = socket.constructTLSSocketInstance();

   // 訂閱TLS Socket相關(guān)的訂閱事件
   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');
   });

   // 設(shè)置通信過(guò)程中使用參數(shù)
   let options = {
       ALPNProtocols: ["spdy/1", "http/1.1"],

       // 連接到指定的IP地址和端口。
       address: {
           address: "192.168.xx.xxx",
           port: xxxx, // 端口
           family: 1,
       },

       // 設(shè)置用于通信過(guò)程中完成校驗(yàn)的參數(shù)。
       secureOptions: {
           key: "xxxx",                            // 密鑰
           cert: "xxxx",                           // 數(shù)字證書
           ca: ["xxxx"],                           // CA證書
           passwd: "xxxx",                         // 生成密鑰時(shí)的密碼
           protocols: [socket.Protocol.TLSv12],    // 通信協(xié)議
           useRemoteCipherPrefer: true,            // 是否優(yōu)先使用對(duì)端密碼套件
           signatureAlgorithms: "rsa_pss_rsae_sha256:ECDSA+SHA256",    // 簽名算法
           cipherSuite: "AES256-SHA256",           // 密碼套件
       },
   };

   // 建立連接
   tlsTwoWay.connect(options, (err, data) => {
       console.error(err);
       console.log(data);
   });

   // 連接使用完畢后,主動(dòng)關(guān)閉。取消相關(guān)事件的訂閱。
   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');
   });

   // 創(chuàng)建一個(gè)(單向認(rèn)證)TLS Socket連接,返回一個(gè)TLS Socket對(duì)象。
   let tlsOneWay = socket.constructTLSSocketInstance(); // One way authentication

   // 訂閱TLS Socket相關(guān)的訂閱事件
   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');
   });

   // 設(shè)置通信過(guò)程中使用參數(shù)
   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);
   });

   // 連接使用完畢后,主動(dòng)關(guān)閉。取消相關(guān)事件的訂閱。
   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');
   });


審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)傳輸
    +關(guān)注

    關(guān)注

    9

    文章

    1746

    瀏覽量

    64336
  • 網(wǎng)絡(luò)管理
    +關(guān)注

    關(guān)注

    0

    文章

    116

    瀏覽量

    27632
  • Socket
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    34606
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1957

    瀏覽量

    29908
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙原生應(yīng)用開發(fā)-網(wǎng)絡(luò)管理Socket連接(一)

    主要由socket模塊提供。具體接口說(shuō)明如下表。 TLS Socket連接主要由tls_socket模塊提供。具體接口說(shuō)明如下表。 本文參考引用Ha
    發(fā)表于 04-01 14:20

    鴻蒙原生應(yīng)用開發(fā)-網(wǎng)絡(luò)管理Socket連接(二)

    應(yīng)用TCP/UDP協(xié)議進(jìn)行通信 1.UDP與TCP流程大體類似,下面以TCP為例: 2.import需要的socket模塊。 3.創(chuàng)建一個(gè)TCPSocket連接,返回一個(gè)TCPSocket對(duì)象
    發(fā)表于 04-02 15:22

    鴻蒙原生應(yīng)用開發(fā)-網(wǎng)絡(luò)管理Socket連接(三)

    應(yīng)用通過(guò)TLS Socket進(jìn)行加密數(shù)據(jù)傳輸 開發(fā)步驟 客戶端TLS Socket流程: 1.import需要的socket模塊。 2.綁定服務(wù)器IP和端口號(hào)。 3.雙向認(rèn)證上傳客戶端
    發(fā)表于 04-03 14:26

    鴻蒙原生應(yīng)用開發(fā)-網(wǎng)絡(luò)管理模塊總述

    一、網(wǎng)絡(luò)管理模塊主要提供以下功能: HTTP數(shù)據(jù)請(qǐng)求:通過(guò)HTTP發(fā)起一個(gè)數(shù)據(jù)請(qǐng)求。 WebSocket連接:使用WebSocket建立服務(wù)器與客戶端的雙向連接
    發(fā)表于 04-08 09:45

    HarmonyOS應(yīng)用開發(fā)NFC、藍(lán)牙、WLAN、網(wǎng)絡(luò)管理、電話服務(wù)資料

    和其他設(shè)備互聯(lián)互通。HarmonyOS網(wǎng)絡(luò)管理模塊主要提供以下功能:數(shù)據(jù)連接管理:網(wǎng)卡綁定,打開URL,數(shù)據(jù)鏈路參數(shù)查詢。數(shù)據(jù)網(wǎng)絡(luò)
    發(fā)表于 09-21 14:19

    【中秋國(guó)慶不斷更】HarmonyOS網(wǎng)絡(luò)管理開發(fā)Socket連接

    簡(jiǎn)介 Socket連接主要是通過(guò)Socket進(jìn)行數(shù)據(jù)傳輸,支持TCP/UDP/TLS協(xié)議。 基本概念 ● Socket:套接字,就是對(duì)網(wǎng)絡(luò)
    發(fā)表于 09-27 15:44

    基于UDP協(xié)議的Socket網(wǎng)絡(luò)編程模式的實(shí)現(xiàn)

    傳輸層進(jìn)行網(wǎng)絡(luò)通信編程的接口是Socket&它是通用的開發(fā)網(wǎng)絡(luò)通信程序標(biāo)準(zhǔn)) 本文介紹了基于UDP協(xié)議Socket編程機(jī)制和原理& 提出了在C/ S模型下以Java
    發(fā)表于 09-09 15:10 ?42次下載

    什么是Socket連接Socket與TCP連接的關(guān)系

    主機(jī) A 的應(yīng)用程序必須通過(guò) Socket 建立連接才能與主機(jī)B的應(yīng)用程序通信,而建立 Socket 連接需要底層 TCP/IP 協(xié)議來(lái)建立 TCP
    發(fā)表于 03-31 15:10 ?1002次閱讀

    什么是Socket連接?與TCP連接有什么關(guān)系?

    什么是Socket連接?它與TCP連接有什么關(guān)系? 計(jì)算機(jī)網(wǎng)絡(luò)是我們?nèi)粘I钪胁豢苫蛉钡囊徊糠郑?b class='flag-5'>Socket
    的頭像 發(fā)表于 05-23 11:43 ?678次閱讀

    什么是Socket連接?它與TCP連接有什么關(guān)系?

    計(jì)算機(jī)網(wǎng)絡(luò)是我們?nèi)粘I钪胁豢苫蛉钡囊徊糠?,?b class='flag-5'>Socket連接則是網(wǎng)絡(luò)通信中必不可少的一種機(jī)制。在本篇文章中,我們將通過(guò)簡(jiǎn)單易懂、生動(dòng)形象的語(yǔ)言,向大家介紹
    的頭像 發(fā)表于 03-06 11:00 ?1192次閱讀
    什么是<b class='flag-5'>Socket</b><b class='flag-5'>連接</b>?它與TCP<b class='flag-5'>連接</b>有什么關(guān)系?

    【干貨】什么是Socket連接?它與TCP連接有什么關(guān)系?

    計(jì)算機(jī)網(wǎng)絡(luò)是我們?nèi)粘I钪胁豢苫蛉钡囊徊糠?,?b class='flag-5'>Socket連接則是網(wǎng)絡(luò)通信中必不可少的一種機(jī)制。在本篇文章中,我們將通過(guò)簡(jiǎn)單易懂、生動(dòng)形象的語(yǔ)言,向大家介紹
    的頭像 發(fā)表于 04-09 10:39 ?1199次閱讀
    【干貨】什么是<b class='flag-5'>Socket</b><b class='flag-5'>連接</b>?它與TCP<b class='flag-5'>連接</b>有什么關(guān)系?

    Socket 網(wǎng)絡(luò)編程框架介紹

    Socket 網(wǎng)絡(luò)編程框架 Socket(套接字)是一個(gè)網(wǎng)絡(luò)編程概念,描述了一個(gè)通信端點(diǎn)(Endpoint),用于建立網(wǎng)絡(luò)連接(Connec
    的頭像 發(fā)表于 11-09 14:19 ?952次閱讀
    <b class='flag-5'>Socket</b> <b class='flag-5'>網(wǎng)絡(luò)</b>編程框架介紹

    什么是Socket連接Socket的工作原理 它與TCP連接有什么關(guān)系?

    和服務(wù)器之間的數(shù)據(jù)交換。 Socket連接的工作原理是基于TCP/IP協(xié)議。TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的傳輸協(xié)議,用于在網(wǎng)絡(luò)中的兩個(gè)應(yīng)用程序之間建立可靠的通信。而
    的頭像 發(fā)表于 01-22 16:10 ?1945次閱讀

    鴻蒙開發(fā)實(shí)戰(zhàn):【網(wǎng)絡(luò)管理-Socket連接

    Socket網(wǎng)絡(luò)通信方面的應(yīng)用,展示了Socket在兩端設(shè)備的連接驗(yàn)證、聊天通信方面的應(yīng)用。
    的頭像 發(fā)表于 03-19 22:04 ?787次閱讀
    鴻蒙<b class='flag-5'>開發(fā)</b>實(shí)戰(zhàn):【<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>管理</b>-<b class='flag-5'>Socket</b><b class='flag-5'>連接</b>】

    鴻蒙OS開發(fā)實(shí)戰(zhàn):【Socket小試MQTT連接

    本篇分享一下 HarmonyOS 中的Socket使用方法 將從2個(gè)方面實(shí)踐: 1. HarmonyOS 手機(jī)應(yīng)用連接PC端 SocketServer 1.
    的頭像 發(fā)表于 04-01 16:14 ?1291次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>實(shí)戰(zhàn):【<b class='flag-5'>Socket</b>小試MQTT<b class='flag-5'>連接</b>】