簡介
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 = 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');
});
// 設置通信過程中使用參數
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');
});
審核編輯 黃宇
-
數據傳輸
+關注
關注
9文章
2201瀏覽量
67586 -
網絡管理
+關注
關注
0文章
127瀏覽量
29348 -
Socket
+關注
關注
1文章
214瀏覽量
36912 -
HarmonyOS
+關注
關注
80文章
2153瀏覽量
36053
發布評論請先 登錄
鴻蒙原生應用開發-網絡管理Socket連接(一)
鴻蒙原生應用開發-網絡管理Socket連接(二)
鴻蒙原生應用開發-網絡管理Socket連接(三)
鴻蒙原生應用開發-網絡管理模塊總述
HarmonyOS應用開發NFC、藍牙、WLAN、網絡管理、電話服務資料
【中秋國慶不斷更】HarmonyOS網絡管理開發—Socket連接
什么是Socket連接?Socket與TCP連接的關系
什么是Socket連接?它與TCP連接有什么關系?
【干貨】什么是Socket連接?它與TCP連接有什么關系?
什么是Socket連接?Socket的工作原理 它與TCP連接有什么關系?
鴻蒙OS開發實戰:【Socket小試MQTT連接】
HarmonyOS 網絡管理開發 —Socket 連接
評論