背景
今天我們要用到socket
應用通過Socket進行資料傳輸,支援TCP和UDP兩種協定。
本文我将帶大家來使用
如何 使用 Socket子產品實作 DAYU200開發闆 和 Windows PC (SocketTool 工具)的之間的資料傳輸。
Socket 子產品可以用來進行資料傳輸,支援TCP和UDP兩種協定。
在我測試的時候發現UDP收發資料有點問題,是以我在這兒用tcp方式給大家示範。
我們先來看一下具體接口說明。
接口名 | 功能描述 |
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支援)。 |
開發步驟
UDP與TCP流程大體類似,下面以TCP為例:
- import需要的socket子產品。
- 建立一個TCPSocket連接配接,傳回一個TCPSocket對象。
- (可選)訂閱TCPSocket相關的訂閱事件。
- 綁定IP位址和端口,端口可以指定或由系統随機配置設定。
- 連接配接到指定的IP位址和端口。
- 發送資料。
- Socket連接配接使用完畢後,主動關閉。
接下來,我們就開始正文。
建立項目
點選下一步
點選finish,等待依賴的加載
這個時候我們先來進行自動簽名
簽完名,運作我們 的新項目
首先它是需要我們打開socket權限,以及擷取wifi位址權限。
"reqPermissions": [
{
"name": "ohos.permission.INTERNET" //socket權限
},
{
"name": "ohos.permission.GET_WIFI_INFO" //擷取wifi位址權限
}
]
接下來我們就需要通過TCP協定實作資料的收發
示範環境:
DAYU200 :
OpenHarmony 3.2.7.5 ETS API9
DevEco Studio 3.0 Release Build Version: 3.0.0.993, Windows 10 10.0
“compileSdkVersion”: 9, “compatibleSdkVersion”: 9,
實作
1.import需要的socket子產品及輔助子產品。
import socket from '@ohos.net.socket';
//wifi子產品,用于擷取目前IP位址
import wifi from '@ohos.wifi';
2.建立一個TCPSocket連接配接,傳回一個TCPSocket對象。
//tcp連接配接對象
let tcp = socket.constructTCPSocketInstance();
//目标位址和端口
let targetAddr = {
address: '172.20.10.2', //要通信的 PC位址,CMD--->ipconfig檢視
family: 1,
port: 0 //UDP:7001/TCP:8001
3.可選)訂閱TCPSocket相關的訂閱事件。
訂閱了connect 、message、close 事件。message事件的回調中可以擷取接收到的資料,
tcpInit() {
tcp.on('connect', () => {
this.status = '已連接配接'
console.info("on tcp connect success");
});
tcp.on('message', value {
console.log("==收到消息:" + value.message + ", remoteInfo:" + value.remoteInfo)
});
tcp.on('close', () => {
console.info("on tcp close success");
});
}
4.綁定IP位址和端口,端口可以指定或由系統随機配置設定。
//bind本地位址
tcp.bind({ address: this.localAddr.address, port: 8001, family: 1 })
.then(() => {
console.info(`bind tcp success`);
}).catch(err {
console.info(`bind tcp failed ${err}`);
return
5.連接配接到指定的IP位址和端口
tcpConnect() {
tcp.getState()
.then((data) => {
console.info(`====${JSON.stringify(data)}`)
if (data.isClose) {
this.tcpInit()
}
//開始連接配接
tcp.connect(
{
address: { address: targetAddr.address, port: 8001, family: 1 }, timeout: 6000
}
).then(() => {
console.info(`connect success`);
}).catch((error) => {
console.info(`connect failed ${JSON.stringify(error)}`);
})
})
}
6.發送資料。
tcpSend() {
//檢視狀态
tcp.getState().then((data) => {
console.info(`====${JSON.stringify(data)}`)
//已連接配接,就發送資料
if (data.isConnected) {
//發送消息
tcp.send(
{ data: this.message_send, }
).then(() => {
console.info(`send success`);
}).catch((error) => {
console.info(`send failed ${JSON.stringify(error)}`);
})
} else {
console.info(`not connect`);
}
})
}
tcpClose() {
tcp.close().then(() => {
this.status = '已斷開'
console.info(`tcp.close success`)
}).catch((err) => {
console.info(`tcp.close error:${JSON.stringify(err)}`)
})
tcp.off('close');
tcp.off('message');
tcp.off('connect');
}