在KaihongOS应用开发中,如何利用Socket进行数据传输 - KaihongOS技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回
杨帆 关注 私信
[文章]

在KaihongOS应用开发中,如何利用Socket进行数据传输

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%')  }}

更多回帖

×
发帖