持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情 短信倒计时
背景
今天我们要用到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`);
}
})
}
7.Socket连接使用完毕后,主动关闭。
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');
}
实验
把DAYU200开发板连上wifi(示例会显示获取的地址),注意和电脑连接的wifi相同。
然后就可以开心的玩耍了,这里要感谢各位的指导,不然也做不出来。