第40节 在ArkTS中实现socket功能

1. 基本概念

  • ArkTS 中实现 Socket 功能主要涉及到网络通信中的套接字(Socket)编程。Socket 是一种用于在不同设备(如客户端和服务器)之间进行双向通信的接口,它允许应用程序发送和接收数据。在网络编程中,有两种主要的 Socket 类型:基于 TCP(传输控制协议)和基于UDP(用户数据报协议)。TCP 提供可靠的、面向连接的通信服务,而 UDP 提供不可靠的、无连接的通信服务,适用于不同的应用场景。

2. 准备工作

  • 导入相关模块:首先需要导入 ArkTS 中用于网络通信的模块。假设模块名为@arkts/network ,代码如下:
import { Socket } from '@arkts/network';
  • 权限配置(如果需要):在应用的配置文件(如 config.json )中,可能需要声明网络访问权限。例如,添加网络访问权限声明:
{
"name": "ohos.permission.INTERNET",
"reason": "应用需要进行网络通信(Socket功能)",
"usedScene": {
"ability": [
".MainAbility"
],
"when": "always"
}
}

1. 创建 Socket 对象(以 TCP 为例)

客户端 Socket 创建:
  • 在客户端,创建一个 TCP Socket 对象用于连接服务器。例如:
let clientSocket: Socket = new Socket('tcp');
服务器端 Socket 创建:
  • 对于服务器端,创建一个 TCP ServerSocket 对象来监听客户端连接。例如:
let serverSocket: Socket = new Socket('tcp-server');

1. TCP 客户端连接和数据交互

连接服务器:
  • 使用客户端 Socket 对象连接服务器,需要指定服务器的 IP 地址和端口号。例如:
let serverIp: string = '127.0.0.1';
let serverPort: number = 8080;
clientSocket.connect(serverIp, serverPort).then(() => {
console.log('已连接到服务器');
// 连接成功后可以发送数据
let dataToSend: string = 'Hello, Server!';
clientSocket.send(dataToSend);
}).catch((error) => {
console.error('连接服务器失败:', error);
});
接收数据:
  • 设置接收数据的事件处理函数,用于处理从服务器接收到的数据。例如:
clientSocket.on('data', (data: string) => {
console.log('从服务器接收数据:', data);
});
关闭连接:
  • 当通信完成后,关闭 Socket 连接。例如:
clientSocket.close();

1. TCP 服务器端监听和数据交互

监听端口:
  • 使用服务器端 Socket 对象监听指定端口,等待客户端连接。例如:
let serverPort: number = 8080;
serverSocket.listen(serverPort).then(() => {
console.log('服务器正在监听端口', serverPort);
}).catch((error) => {
console.error('监听端口失败:', error);
});

处理客户端连接:

  • 当有客户端连接时,接受连接并获取客户端 Socket 对象,用于与客户端进行数据交互。例如:
serverSocket.on('connection', (client: Socket) => {
console.log('有客户端连接');
// 接收客户端发送的数据
client.on('data', (data: string) => {
console.log('从客户端接收数据:', data);
// 发送响应数据给客户端
let responseData: string = 'Hello, Client!';
client.send(responseData);
});
// 处理客户端连接关闭事件
client.on('close', () => {
console.log('客户端连接已关闭');
});
});

1. UDP 通信(简要示例)

UDP 发送数据(客户端):
  • 创建 UDP Socket 对象并发送数据。例如:
let udpSocket: Socket = new Socket('udp');
let serverIp: string = '127.0.0.1';
let serverPort: number = 8080;
let dataToSend: string = 'UDP Data';
udpSocket.sendTo(dataToSend, serverIp, serverPort);
UDP 接收数据(服务器端):
  • 在服务器端,设置接收数据的事件处理函数。例如:
let udpServerSocket: Socket = new Socket('udp-server');
let serverPort: number = 8080;
udpServerSocket.bind(serverPort).then(() => {
console.log('UDP服务器正在监听端口', serverPort);
udpServerSocket.on('data', (data: string, remoteInfo: any) => {
console.log('从客户端接收UDP数据:', data);
console.log('客户端信息:', remoteInfo);
});
}).catch((error) => {
console.error('UDP绑定端口失败:', error);
});

1. 错误处理和异常情况考虑

  • 连接错误处理:在连接服务器(TCP UDP)过程中,可能会出现各种错误,如网络不可用、服务器未启动、IP 地址或端口错误等。需要在 connect TCP 客户端)或 bind UDP服务器)等操作的 catch 块中进行适当的错误处理,如提示用户网络错误或重试连接。
  • 数据传输错误处理:在数据发送和接收过程中,也可能出现错误,如数据丢失(UDP)、网 络拥塞导致的数据发送失败等。可以在 send 方法的 catch 块中处理发送失败的情况,以及data 事件处理函数中对接收的数据进行完整性检查等操作。
  • Socket 关闭异常处理:如果 Socket 在异常情况下(如网络突然中断)关闭,可能会导致未 完成的数据传输或资源未释放的问题。需要在 close 事件处理函数中进行资源清理工作,如释放相关的内存资源、关闭文件描述符等。

2. 应用场景

  • 实时聊天应用:通过 Socket 建立客户端和服务器之间的长连接,实现实时的消息发送和接收,类似于即时通讯软件。
  • 文件传输应用:利用 TCP 的可靠性,在客户端和服务器之间进行文件的上传和下载操作,通 Socket 传输文件数据块。
  • 网络游戏开发:在游戏客户端和服务器之间进行数据交互,如玩家的操作信息发送、游戏状态更新等,UDP 可以用于一些对实时性要求高但对数据完整性要求相对较低的场景,如玩家位置更新等;TCP 用于重要的游戏数据传输,如登录验证、游戏道具交易等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35673.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

工具篇--GitHub Desktop 使用

文章目录 前言一、GitHub Desktop 的使用:1.1 通过官网下载GitHub Desktop和安装:1.2 安装和使用:1.2.1 填充自己的标识:1.2.3 克隆项目:1.2.4 git 常用忽略项配置: 二、代码的更新和提交:2.1 代…

MySQL事物隔离级别详细解释

目录 事务隔离级别总结 实际情况演示 脏读(读未提交) 避免脏读(读已提交) 不可重复读 可重复读 幻读 解决幻读的方法 事务隔离级别总结 SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交) :最低的隔离级别,允许读取尚未提…

[每周一更]-(第126期):MQ解耦场景

消息队列(MQ)解耦是一种软件架构设计模式,主要通过中间件将系统中的生产者和消费者模块分离,减少模块之间的直接依赖,使系统具有更高的扩展性和灵活性。这种模式尤其适用于需要处理复杂业务逻辑、频繁请求或异步处理的…

Redis的高可用之哨兵模式

Redis哨兵主要是解决Redis主从同步时主数据库宕机问题,使其能够自动进行故障恢复,提高Redis系统的高可用性。 1. 哨兵的作用: 监控:哨兵通过心跳机制监控主库和从库的存活性。 选主:当主库宕机时,哨兵会选举出一个领…

知识分享|一文了解实时荧光定量PCR(qPCR)技术的原理与分类

实时荧光定量PCR技术(Realtime quantitative PCR,qPCR)是在PCR反应体系中添加荧光报告基团和荧光淬灭基团,通过荧光信号来实现对核酸分子的定量检测过程在反应过程中,PCR产物随着扩增反应的进行不断生成,荧光信号不断增加&#xf…

【MySQL】环境变量配置

环境变量英文名SystemRoot,直译为“系统总(根)目录",主要指明操作系统的重要目录在哪里。那么配置MySQL的环境变量,就是在程序运行时,告诉操作系统你的MySQL目录位置。 复制MySQL安装目录:…

高级 CEF 内核集成与 VC++——开发环境搭建与配置

开发环境的搭建是 CEF 浏览器开发中至关重要的一步。正确配置开发环境不仅能提高开发效率,也能确保开发过程中的稳定性与可靠性。本文将结合最新的资料和技术方案,深入讲解如何搭建 CEF 编译与配置环境,正确配置 Windows SDK 与依赖库&#x…

【React】组件通讯有哪几种方式?

文章目录 一、父子组件通讯二、兄弟组件通讯3、context 跨级组件通讯 提示:以下是本篇文章正文内容,下面案例可供参考 一、父子组件通讯 父组件 ----> 子组件: props 父组件提供要传递的 state 数据 给子组件标签添加属性,值…

huggingface-cli下载数据(含下载指定数据教程)

在国内,推荐使用:HF-Mirror 1.尝试下载大模型相关文件 在huggingface镜像首页,可以看到如图: 2.使用huggingface-cli下载文件 2.1 首先激活自己的虚拟环境,然后安装环境,使用如下命令: pip …

生产慎用之调试日志对空间矢量数据批量插入的性能影响-以MybatisPlus为例

目录 前言 一、一些缘由 1、性能分析 二、插入方式调整 1、批量插入的实现 2、MP的批量插入实现 3、日志的配置 三、默认处理方式 1、基础程序代码 2、执行情况 四、提升调试日志等级 1、在logback中进行设置 2、提升后的效果 五、总结 前言 在现代软件开发中&…

Linux下编译安装METIS

本文记录Linux下编译安装METIS的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1 一、安装依赖 1.1 下载GKlib sudo apt-get install build-essential sudo apt-get install cmake 2.2 编译安装GKlib 下载GKlib代码, …

数据链路层总结

- - 链路、物理链路:两节点间物理线路(有线、无线),中间没有任何其他的交换节点 数据链路、逻辑链路: 链路 协议需要的硬件、软件 网络适配器(网卡):包含物理层、数据链路层 网络适配器软件驱动程…

基于Java和Vue开发的漫画阅读软件漫画阅读小程序漫画APP

前景分析 受众广泛:漫画的受众群体广泛,不仅限于青少年,还涵盖了成年人等多个年龄层和社会阶层。漫画文化在全球范围内的影响力不断扩大,未来漫画软件创业可以考虑全球市场的拓展。 市场需求大:数字化阅读趋势下&…

LoRa无线空调计费系统都应用在哪里

中央空调计费系统由于布线方式需要消耗大量的人力及成本,LoRa在楼宇自控及智能家居中的应用越来越广泛,成为当前普遍应用的通信技术。 LoRa模块无线传输技术的不断完善,逐步解决了温控器通信方面布线困难、施工成本高的问题,促进…

4.STM32通信接口之SPI通信---硬件SPI的介绍

上一节,我们学会软件的SPI,本节,我们将学习STM32的SPI硬件收发电路,虽然STM32的硬件收发电路很强大,但是,很多我们都用不到,我们只需会最基本的就可以。硬件的好处就是稳定,功能模块…

Open AI 推出 ChatGPT Pro

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

洛谷P1030 [NOIP2001 普及组] 求先序排列(c嘎嘎)

题目链接:P1030 [NOIP2001 普及组] 求先序排列 - 洛谷 | 计算机科学教育新生态 题目难度:普及 解题思路:这道题和之前做过的一道题很像,举一反三就行 相似题目:P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 |…

创意型广告如何配音梨花声音研修院退费

张弛播音5天训练营靠谱吗,在当今竞争激烈的广告市场中,创意型广告以其独特的构思和表现形式脱颖而出。而配音作为广告的重要组成部分,对于创意型广告的成功起着至关重要的作用。 在为创意型广告配音之前,首先要深入理解广告的创意…

探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题

探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题 背景Python 版本升级 问题描述原因分析与解决方案 Python 应用的分层依赖:安装与部署的视角libvirt-python的分层依赖尝试的解决方案 使用编译好的 .whl 文件"嫁接"整个…

SpringBoot+ENC实现密钥加密及使用原理

?? 作者: ?? 主页: https://blog.csdn.net/zhuocailing3390 ?? 社区: Java技术栈交流 ?? 主题: SpringBootENC实现密钥加密及使用原理 创作时间: 2024年06月23日 目录 前言1、整合SpringBoot 1.1、POM…