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

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

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

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

王程 ? 來源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-18 09:20 ? 次閱讀

簡介

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

基本概念

? ● Socket:套接字,就是對網(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è)簡單的面向消息的傳輸層,不需要連接。

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

場景介紹

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

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

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

接口說明

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

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

接口名 功能描述
constructUDPSocketInstance() 創(chuàng)建一個(gè) UDPSocket 對象。
constructTCPSocketInstance() 創(chuàng)建一個(gè) TCPSocket 對象。
bind() 綁定 IP 地址和端口。
send() 發(fā)送數(shù)據(jù)。
close() 關(guān)閉連接。
getState() 獲取 Socket 狀態(tài)。
connect() 連接到指定的 IP 地址和端口(僅 TCP 支持)
getRemoteAddress() 獲取對端 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 模塊提供。具體接口說明如下表。

接口名 功能描述
constructTLSSocketInstance() 創(chuàng)建一個(gè) TLSSocket 對象。
bind() 綁定 IP 地址和端口號。
close(type: ‘error’) 關(guān)閉連接。
connect() 連接到指定的 IP 地址和端口。
getCertificate() 返回表示本地證書的對象。
getCipherSuite() 返回包含協(xié)商的密碼套件信息的列表。
getProtocol() 返回包含當(dāng)前連接協(xié)商的 SSL/TLS 協(xié)議版本的字符串。
getRemoteAddress() 獲取 TLSSocket 連接的對端地址。
getRemoteCertificate() 返回表示對等證書的對象。
getSignatureAlgorithms() 在服務(wù)器和客戶端之間共享的簽名算法列表,按優(yōu)先級降序排列。
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 對象。

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

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

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

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

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

import socket from '@ohos.net.socket'

// 創(chuàng)建一個(gè)TCPSocket連接,返回一個(gè)TCPSocket對象。
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');
    })
  });
});
// 連接使用完畢后,主動關(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)用通過 TLS Socket 進(jìn)行加密數(shù)據(jù)傳輸

開發(fā)步驟

客戶端 TLS Socket 流程:

? 1. import 需要的 socket 模塊。

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

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

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

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

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

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

 import socket from '@ohos.net.socket'

   // 創(chuàng)建一個(gè)(雙向認(rèn)證)TLS Socket連接,返回一個(gè)TLS Socket對象。
   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è)置通信過程中使用參數(shù)
   let options = {
       ALPNProtocols: ["spdy/1", "http/1.1"],

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

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

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

   // 連接使用完畢后,主動關(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對象。
   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è)置通信過程中使用參數(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);
   });

   // 連接使用完畢后,主動關(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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)傳輸
    +關(guān)注

    關(guān)注

    9

    文章

    1931

    瀏覽量

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

    關(guān)注

    0

    文章

    122

    瀏覽量

    27703
  • Socket
    +關(guān)注

    關(guān)注

    0

    文章

    212

    瀏覽量

    34778
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1980

    瀏覽量

    30335
收藏 人收藏

    評論

    相關(guān)推薦

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

    主要由socket模塊提供。具體接口說明如下表。 TLS Socket連接主要由tls_socket模塊提供。具體接口說明如下表。 本文參考引用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對象
    發(fā)表于 04-02 15:22

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

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

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

    一、網(wǎng)絡(luò)管理模塊主要提供以下功能: HTTP數(shù)據(jù)請求:通過HTTP發(fā)起一個(gè)數(shù)據(jù)請求。 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

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

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

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

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

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

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

    鴻蒙開發(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 ?923次閱讀
    鴻蒙<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 ?1564次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>實(shí)戰(zhàn):【<b class='flag-5'>Socket</b>小試MQTT<b class='flag-5'>連接</b>】

    socket連接超時(shí)如何處理

    網(wǎng)絡(luò)編程中,socket連接超時(shí)是一個(gè)常見的問題,它可能由多種原因引起,比如網(wǎng)絡(luò)延遲、服務(wù)器負(fù)載過高或者客戶端請求超時(shí)設(shè)置過短等。處理socket
    的頭像 發(fā)表于 11-01 16:48 ?868次閱讀

    socket 連接超時(shí)處理技巧

    網(wǎng)絡(luò)編程中,Socket連接超時(shí)是一個(gè)常見的問題。處理超時(shí)的關(guān)鍵在于確保程序能夠優(yōu)雅地處理這些情況,避免程序崩潰或者無響應(yīng)。以下是一些處理Socket
    的頭像 發(fā)表于 11-12 14:13 ?525次閱讀