KaihongOS
Socket
在KaihongOS应用开发中,可以利用Socket进行数据传输的能力,支持TCPSocket、UDPSocket、WebSocket和TLSSocket。详细的API接口文档请参考:@ohos.net.socket (Socket连接)。
应用 TCP/UDP 协议进行通信
UDP 与 TCP 流程大体类似,下面以 TCP 为例:
- import 需要的 socket 模块。
- 创建一个 TCPSocket 连接,返回一个 TCPSocket 对象。
- (可选)订阅 TCPSocket 相关的订阅事件。
- 绑定 IP 地址和端口,端口可以指定或由系统随机分配。
- 连接到指定的 IP 地址和端口。
- 发送数据。
- Socket 连接使用完毕后,主动关闭。
import socket from '@ohos.net.socket';import { BusinessError } from '@ohos.base';class Socketinfo { message: ArrayBuffer = new ArrayBuffer(1); remoteInfo: socket.SocketRemoteInfo = {} as socket.SocketRemoteInfo;}let tcp: socket.TCPSocket = socket.constructTCPSocketInstance();@Entry@Componentstruct Tcp { @State message: string = 'Hello World'; // 创建一个TCPSocket连接,返回一个TCPSocket对象。 createTCPSocket() { tcp.on('message', (value: SocketInfo) => { 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地址和端口。 bindIPPort() { let ipAddress : socket.NetAddress = {} as socket.NetAddress; ipAddress.address = "192.168.xxx.xxx"; ipAddress.port = 1234; tcp.bind(ipAddress, (err: BusinessError) => { if (err) { console.log('bind fail'); return; } console.log('bind success'); // 连接到指定的IP地址和端口。 ipAddress.address = "192.168.xxx.xxx"; ipAddress.port = 5678; let tcpConnect : socket.TCPConnectOptions = {} as socket.TCPConnectOptions; tcpConnect.address = ipAddress; tcpConnect.timeout = 6000; tcp.connect(tcpConnect).then(() => { console.log('connect success'); let tcpSendOptions: socket.TCPSendOptions = { data: 'Hello, server!' } tcp.send(tcpSendOptions).then(() => { console.log('send success'); }).catch((err: BusinessError) => { console.log('send fail'); }); }).catch((err: BusinessError) => { console.log('connect fail'); }); }); } // 连接使用完毕后,主动关闭。取消相关事件的订阅。 closeSocket() { tcp.close().then(() => { console.log('close success'); }).catch((err: BusinessError) => { console.log('close fail'); }); tcp.off('message'); tcp.off('connect'); tcp.off('close'); } build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) } .width('100%') } .height('100%') }}应用通过 TCP Socket Server 进行数据传输
开发步骤
服务端 TCP Socket 流程:
- import 需要的 socket 模块。
- 创建一个 TCPSocketServer 连接,返回一个 TCPSocketServer 对象。
- 绑定本地 IP 地址和端口,监听并接受与此套接字建立的客户端 TCPSocket 连接。
- 订阅 TCPSocketServer 的 connect 事件,用于监听客户端的连接状态。
- 客户端与服务端建立连接后,返回一个 TCPSocketConnection 对象,用于与客户端通信。
- 订阅 TCPSocketConnection 相关的事件,通过 TCPSocketConnection 向客户端发送数据。
- 主动关闭与客户端的连接。
- 取消 TCPSocketConnection 和 TCPSocketServer 相关事件的订阅。
import socket from '@ohos.net.socket';import { BusinessError } from '@ohos.base';class SocketInfo { message: ArrayBuffer = new ArrayBuffer(1); remoteInfo: socket.SocketRemoteInfo = {} as socket.SocketRemoteInfo;}// 创建一个TCPSocketServer连接,返回一个TCPSocketServer对象。let tcpServer: socket.TCPSocketServer = socket.constructTCPSocketServerInstance();@Entry@Componentstruct TcpServer { @State message: string = 'Hello World'; // 绑定本地IP地址和端口,进行监听 bindPort() { let ipAddress : socket.NetAddress = {} as socket.NetAddress; ipAddress.address = "192.168.xxx.xxx"; ipAddress.port = 4651; tcpServer.listen(ipAddress).then(() => { console.log('listen success'); }).catch((err: BusinessError) => { console.log('listen fail'); }); } // 订阅TCPSocketServer的connect事件 onConnect() { tcpServer.on("connect", (client: socket.TCPSocketConnection) => { // 订阅TCPSocketConnection相关的事件 client.on("close", () => { console.log("on close success"); }); client.on("message", (value: SocketInfo) => { 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("received message--:" + str); console.log("received address--:" + value.remoteInfo.address); console.log("received family--:" + value.remoteInfo.family); console.log("received port--:" + value.remoteInfo.port); console.log("received size--:" + value.remoteInfo.size); }); // 向客户端发送数据 let tcpSendOptions : socket.TCPSendOptions = {} as socket.TCPSendOptions; tcpSendOptions.data = 'Hello, client!'; client.send(tcpSendOptions).then(() => { console.log('send success'); }).catch((err: Object) => { console.error('send fail: ' + JSON.stringify(err)); }); // 关闭与客户端的连接 client.close().then(() => { console.log('close success'); }).catch((err: BusinessError) => { console.log('close fail'); }); // 取消TCPSocketConnection相关的事件订阅 setTimeout(() => { client.off("message"); client.off("close"); }, 10 * 1000); }); } // 取消TCPSocketServer相关的事件订阅 offSocket() { tcpServer.off("connect"); } build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) } .width('100%') } .height('100%') }}
更多回帖

长按上方图片保存到相册