当前位置: 首页 > news >正文

鸿蒙本地模拟器 模拟TCP服务端的过程

鸿蒙模拟器模拟TCP服务端的过程涉及几个关键步骤,主要包括创建TCPSocketServer实例、绑定IP地址和端口、监听连接请求、接收和发送数据以及处理连接事件。以下是详细的模拟过程:
**1.创建TCPSocketServer实例:**首先,需要导入鸿蒙的socket模块,并创建一个TCPSocketServer对象。这个对象将用于管理TCP连接。

**2.绑定IP地址和端口:**通过调用listen()方法,将TCPSocketServer实例绑定到本地IP地址和端口上。这样,服务端就可以监听指定端口上的连接请求。

**3.监听连接请求:**服务端通过订阅TCPSocketServer的connect事件来监听客户端的连接请求。当客户端尝试连接时,服务端会接收到一个连接事件。

**4.接收和发送数据:**一旦客户端和服务端建立连接,服务端会返回一个TCPSocketConnection对象,用于与客户端进行数据通信。服务端可以通过订阅TCPSocketConnection的message事件来接收客户端发送的数据,并通过调用send()方法来向客户端发送数据。

**5.处理连接事件:**服务端还需要处理其他事件,如close和error,以管理连接的生命周期和错误处理。

**6.UI效果展示:**在模拟器上,服务端接收到的控制命令可以通过UI界面展示。例如,当客户端发送一个“开灯”命令时,服务端的UI界面会相应地更新灯的状态,或者通过改变颜色或显示图片来模拟灯的开启。

**7.端口映射和转发:**为了使服务端能够在模拟器上正确地与外部客户端通信,可能需要进行端口映射和转发。这通常通过命令行工具如netsh或鸿蒙的HDC命令来实现,将模拟器的端口映射到主机的端口上。

上诉步骤中,1-6的步骤可以根据开发者文档的TCP服务端实现操作,并且直接通过本地模拟器运行项目即可。例如以下案例:

/*** 1.导入 socket 模块*/
import { socket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';/*** 2.创建 TCPSocketServer* 创建一个 TCPSocketServer 连接,返回一个 TCPSocketServer 对象。*/
let tcpServer: socket.TCPSocketServer = socket.constructTCPSocketServerInstance();class SocketInfo {message: ArrayBuffer = new ArrayBuffer(1);remoteInfo: socket.SocketRemoteInfo = {} as socket.SocketRemoteInfo;
}@Entry
@Component
struct Index {@State showDatas: string[] = [] //用于接收客服端发送的消息@State serverLocalIp: string = '127.0.0.1'@State serverPort: number = 8000@State serverData:string = '服务端发送的信息'private connectState: boolean = falseprivate tcpSocketConnection ?: socket.TCPSocketConnectionasync listenServer(serverIp: string, serverPort: number) {let ipAddress: socket.NetAddress = {address: serverIp,port: serverPort,}// 绑定IP:Port、监听并启动服务,接收客户端的连接请求tcpServer.listen(ipAddress).then(() => {console.info('===listen success===');tcpServer.on("connect", (tcpConnection: socket.TCPSocketConnection) => {console.info("===connect success====")this.connectState = truethis.tcpSocketConnection = tcpConnectiontcpConnection.on("message", (data: SocketInfo) => {console.info("====receive message====")let buffer = data.message;let dataView = new DataView(buffer);let messageData = "";for (let i = 0; i < dataView.byteLength; ++i) {messageData += String.fromCharCode(dataView.getUint8(i));}this.showDatas.push('客户端:' + messageData)});// 订阅TCPSocketConnection相关的事件tcpConnection.on("close", () => {console.info("===断开连接===");});})}).catch((err: BusinessError) => {console.info('listen fail');});}async sendData(message: string) {if (this.connectState) { //连接成功才可发送数据// 服务端给连接的客户端发送信息let tcpSendOptions: socket.TCPSendOptions = {} as socket.TCPSendOptions;tcpSendOptions.data = messagethis.tcpSocketConnection?.send(tcpSendOptions).then(() => {console.info('===send success===');this.showDatas.push('服务端:' + tcpSendOptions.data)})}}build() {Column({ space: 5 }) {Text('TCP的服务端实现').fontSize(30)Row({ space: 5 }) {Text('服务端ip:').width(110).fontSize(20).textAlign(TextAlign.End)TextInput({ placeholder: this.serverLocalIp }).fontSize(20).width('60%').onChange((value) => {this.serverLocalIp = value})}Row({ space: 5 }) {Text('服务端port:').width(110).fontSize(20).textAlign(TextAlign.End)TextInput({ placeholder: this.serverPort.toString() }).fontSize(20).width('60%').type(InputType.Number).onChange((value) => {this.serverPort = parseInt(value)})}Button('服务端启动并监听连接').fontSize(25).onClick(() => {this.listenServer(this.serverLocalIp, this.serverPort)})TextInput({ placeholder: this.serverData }).fontSize(20).width('90%').height(50).onChange((value) => {this.serverData = value})Button('发送消息') //监听连接状态.fontSize(25).onClick(()=>{this.sendData(this.serverData)})List(){ListItem(){Text('服务端消息展示:')}ForEach(this.showDatas, (item: string) => {ListItem(){Text(item).fontSize(20)}})}.width('95%').layoutWeight(1)}}
}

以上代码的UI效果:
在这里插入图片描述

因为需要使用网络,需要开通网络权限:
在这里插入图片描述

本地模拟器模拟TCP服务端的必备操作

IP端口映射

  1. 以管理员身份运行 命令提示符
    在这里插入图片描述

  2. 电脑IP和本地模拟器IP端口映射
    在命令行输入以下代码,其中connectaddress=127.0.0.1 connectport=8000必须一致
    当有服务访问"你电脑的IP:8888"时,操作系统会自动映射到“127.0.0.1:8000

netsh interface portproxy add v4tov4 listenaddress=你的电脑的IP地址 listenport=8888 connectaddress=127.0.0.1 connectport=8000

显示映射结果

netsh interface portproxy show v4tov4

设置端口转发

首先启动本地模拟器
在进行端口转发前,一定要先启动本地模拟器,即 本地模拟器每次重启都需要重新设备端口转发

接下来需要配置鸿蒙模拟器端口转发,使用HDC命令操作,需要用到hdc.exe文件,该文件在OpenHarmony SDK目录下的\toolchains目录内部找到(每个人的路径不同),需要记住该目录。例如我的电脑上hdc.exe的路径:
在这里插入图片描述
进入toolchains目录,在命令行执行以下命令进行端口转发:
注意:本地模拟器每次重启都需要重新进行端口转发

hdc.exe -t 127.0.0.1:5555 fport tcp:8000 tcp:8000

执行以上命令,得到如下结果
在这里插入图片描述
最后将项目部署到模拟器上,启动服务端便可以和TCP客户端连接并且通信了!!!

相关文章:

鸿蒙本地模拟器 模拟TCP服务端的过程

鸿蒙模拟器模拟TCP服务端的过程涉及几个关键步骤&#xff0c;主要包括创建TCPSocketServer实例、绑定IP地址和端口、监听连接请求、接收和发送数据以及处理连接事件。以下是详细的模拟过程&#xff1a; **1.创建TCPSocketServer实例&#xff1a;**首先&#xff0c;需要导入鸿蒙…...

Qt/C++基于重力模拟的像素点水平堆叠效果

本文将深入解析一个基于 Qt/C 的像素点模拟程序。程序通过 重力作用&#xff0c;将随机分布的像素点下落并水平堆叠&#xff0c;同时支持窗口动态拉伸后重新计算像素点分布。 程序功能概述 随机生成像素点&#xff1a;程序在初始化时随机生成一定数量的像素点&#xff0c;每个…...

Zookeeper学习心得

本人学zookeeper时按照此文路线学的 Zookeeper学习大纲 - 似懂非懂视为不懂 - 博客园 一、Zookeeper安装 ZooKeeper 入门教程 - Java陈序员 - 博客园 Docker安装Zookeeper教程&#xff08;超详细&#xff09;_docker 安装zk-CSDN博客 二、 zookeeper的数据模型 ZooKeepe…...

嵌入式开发工程师面试题 - 2024/11/24

原文嵌入式开发工程师面试题 - 2024/11/24 转载请注明来源 1.若有以下定义语句double a[8]&#xff0c;*pa&#xff1b;int i5&#xff1b;对数组元素错误的引用是&#xff1f; A *a B a[5] C *&#xff08;p1&#xff09; D p[8] 解析&#xff1a; 在 C 或 C 语言中&am…...

Python中打印当前目录文件树的脚本

效果图&#xff1a; 实现脚本&#xff1a; 1、显示所有文件和文件夹&#xff1a; import osdef list_files(startpath, prefix):items os.listdir(startpath)items.sort()for index, item in enumerate(items):item_path os.path.join(startpath, item)is_last index le…...

全景图像(Panorama Image)向透视图像(Perspective Image)的跨视图转化(Cross-view)

一、概念讲解 全景图像到透视图像的转化是一个复杂的图像处理过程&#xff0c;它涉及到将一个360度的全景图像转换为一个具有透视效果的图像&#xff0c;这种图像更接近于人眼观察世界的方式。全景图像通常是一个矩形图像&#xff0c;它通过将球面图像映射到平面上得到&#xf…...

Redis 中的 hcan 命令耗内存,有什么优化的方式吗 ?

Redis 中的 hcan 命令耗内存&#xff0c;有什么优化的方式吗 &#xff1f; 1. 使用合适的游标值&#xff1a;2. 控制每次迭代返回的键数量&#xff1a;3. 避免长时间运行的迭代&#xff1a;4. 使用HSCAN与SCAN命令结合&#xff1a;5. 优化哈希表结构&#xff1a;6. 监控和调整R…...

豆包MarsCode算法题:三数之和问题

问题描述 思路分析 1. 排序数组 目的: 将数组 arr 按升序排序&#xff0c;这样可以方便地使用双指针找到满足条件的三元组&#xff0c;同时避免重复的三元组被重复计算。优势: 数组有序后&#xff0c;处理两个数和 target - arr[i] 的问题可以通过双指针快速找到所有可能的组…...

【Android】AnimationDrawable帧动画的实现

目录 引言 一、AnimationDrawable常用方法 1.1 导包 1.2 addFrame 1.3 setOneShot 1.4 start 1.5 stop 1.6 isRunning 二、 从xml文件获取并播放帧动画 2.1 创建XML文件 2.2 在布局文件中使用帧动画资源 三、在代码中生成并播放帧动画 3.1 addFrame加入帧动画列…...

【消息序列】详解(7):剖析回环模式--设备测试的核心利器

目录 一、概述 1.1. 本地回环模式 1.2. 远程环回模式 二、本地回环模式&#xff08;Local Loopback mode&#xff09; 2.1. 步骤 1&#xff1a;主机进入本地环回模式 2.2. 本地回环测试 2.2.1. 步骤 2a&#xff1a;主机发送HCI数据包并接收环回数据 2.2.2. 步骤 2b&…...

解决Ubuntu 22.04系统中网络Ping问题的方法

在Ubuntu 22.04系统中&#xff0c;网络问题时有发生&#xff0c;尤其是当涉及到静态IP地址配置和网线直连的两台机器时。本文将探讨一种常见问题——断开并重新连接网线后&#xff0c;尽管网卡显示为UP状态&#xff0c;但无法立即ping通对方机器&#xff0c;以及如何解决这一问…...

【大数据学习 | Spark-SQL】Spark-SQL编程

上面的是SparkSQL的API操作。 1. 将RDD转化为DataFrame对象 DataFrame&#xff1a; DataFrame是一种以RDD为基础的分布式数据集&#xff0c;类似于传统数据库中的二维表格。带有schema元信息&#xff0c;即DataFrame所表示的二维表数据集的每一列都带有名称和类型。这样的数…...

15分钟做完一个小程序,腾讯这个工具有点东西

我记得很久之前&#xff0c;我们都在讲什么低代码/无代码平台&#xff0c;这个概念很久了&#xff0c;但是&#xff0c;一直没有很好的落地&#xff0c;整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来&#xff0c;各大科技公司也都推出了很多 AI 代码助手&#xff…...

manim动画编程(安装+入门)

文章目录 1.基本介绍2.效果展示3.安装步骤3.1安装manba软件3.2配置环境变量3.3查看是否成功3.4什么是mamba3.5创建虚拟环境3.6尝试进入虚拟环境 4.vscode操作4.1默认配置文件 5.安装ffmpeg6.安装manim软件6.vscode制作7.我的学习收获 1.基本介绍 这个manim就是一款软件&#x…...

STL算法之数值算法<stl_numeric.h>

这一节介绍的算法&#xff0c;统称为数值(numeric)算法。STL规定&#xff0c;欲使用它们&#xff0c;客户端必须包含头文件<numeric>.SGI将它们实现与<stl_numeric.h>文件中。 目录 运用实例 accumulate adjacent_difference inner_product partial_sum pow…...

Oracle如何记录登录用户IP

在运维场景中&#xff0c;在定位到某个SQL引起系统故障之后&#xff0c;想知道是哪台机器发过来的&#xff0c;方便定位源头&#xff0c;该如何解决&#xff1f; 在 Oracle 数据库中记录登录用户的 IP 地址可以通过多种方法实现。以下是几种常见的方法&#xff0c;包括使用触发…...

Python图像处理:打造平滑液化效果动画

液化动画中的强度变化是通过在每一帧中逐渐调整液化效果的强度参数来实现的。在提供的代码示例中&#xff0c;强度变化是通过一个简单的线性插值方法来控制的&#xff0c;即随着动画帧数的增加&#xff0c;液化效果的强度也逐渐增加。 def liquify_image(image, center, radius…...

构建Ceph分布式文件共享系统:手动部署指南

#作者:西门吹雪 文章目录 micro-Services-TutorialCeph分布式文件共享方案部署Ceph集群使用CephCeph在kubernetes集群中的使用 micro-Services-Tutorial 微服务最早由Martin Fowler与James Lewis于2014年共同提出&#xff0c;微服务架构风格是一种使用一套小服务来开发单个应…...

数据结构——用数组实现栈和队列

目录 用数组实现栈和队列 一、数组实现栈 1.stack类 2.测试 二、数组实现队列 1.Queue类 2.测试 查询——数组&#xff1a;数组在内存中是连续空间 增删改——链表&#xff1a;链表的增删改处理更方便一些 满足数据先进后出的特点的就是栈&#xff0c;先进先出就是队列…...

vue3typescript,shims-vue.d.ts中declare module的vue声明

webpack已经有了vue-loader这些loader了&#xff0c;为什么还需要declare module *.vue’呢&#xff1f; declare module 是为了告诉 tsc 这是一个“模块”。 如果不声明&#xff0c; IDE 里因为 tsc 类型检查&#xff0c; lint 会标红。 但vue-loader 是在 Webpack 构建阶段使…...

ctf show web 入门43

打开靶场代码逻辑如下&#xff1a; if(!preg_match(“/\ |/|cat/i”, $c)) 它过滤了三个关键内容&#xff1a; \ (空格)&#xff1a;你不能直接在命令中使用空格&#xff08;例如 ls -l 或 cat flag 都会失败&#xff09;。 / (正斜杠)&#xff1a;你不能使用路径符号&#xf…...

Go语言单例模式如何实现_Go语言单例模式教程【通俗】

sync.Once是最安全的单例初始化方式&#xff0c;天然解决并发首次调用竞态问题&#xff0c;只执行一次闭包&#xff1b;须作包级或结构体字段&#xff0c;避免局部变量失效&#xff1b;panic后会持续失败&#xff0c;需自行兜底。Go 里 sync.Once 是最安全的单例初始化方式直接…...

婚宴座位规划中的优化算法:量子与经典方法对比

1. 婚宴座位规划中的优化算法对决&#xff1a;量子与经典方法谁更胜一筹&#xff1f;筹备婚礼时&#xff0c;最令人头疼的任务之一就是安排座位。去年我为自己婚礼设计座位表时&#xff0c;尝试了各种方法——从手工调整Excel表格到使用专业活动策划软件&#xff0c;结果都不尽…...

Obsidian智能管家:基于规则引擎的笔记库自动化运维实践

1. 项目概述&#xff1a;一个为Obsidian而生的智能管家如果你和我一样&#xff0c;是个重度Obsidian用户&#xff0c;那你一定经历过这样的时刻&#xff1a;笔记库越来越大&#xff0c;文件散落在各个角落&#xff0c;标签和链接关系变得错综复杂&#xff0c;想要找一个特定的笔…...

【Midjourney 2026审美趋势白皮书】:基于127万组V6–V7生成样本的AI视觉演化模型预测

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney 2026审美趋势白皮书导论 人工智能图像生成正从“可用”迈向“可策展”阶段。Midjourney v6.5 及其预发布的 Beta-2026 引擎已展现出对文化语境、跨媒介质感与时间性美学的深层建模能力——这…...

从音频处理到IoT数据:用scipy.signal.resample_poly搞定实际项目中的采样率转换

从音频处理到IoT数据&#xff1a;用scipy.signal.resample_poly搞定实际项目中的采样率转换 采样率转换是数字信号处理中的常见需求&#xff0c;无论是音频处理、传感器数据分析还是通信系统仿真&#xff0c;都会遇到不同采样率设备间的数据交互问题。想象一下&#xff0c;当你…...

孤舟笔记 IO 与网络编程篇六 什么是网络四元组?它是理解TCP连接的关键

文章目录一、先说结论&#xff1a;四元组核心事实二、四元组是什么&#xff1f;三、一个端口能建立多少连接&#xff1f;四、客户端的连接上限五、NAT 和四元组六、四元组在负载均衡中的应用网络四元组 全景回答技巧与点评标准回答加分回答面试官点评个人网站面试官问"一个…...

制造业备品备件管理痛点破解:磐石电气无人仓库解决方案

在制造业设备自动化、产线连续化运行需求日益提升的当下&#xff0c;备品备件、工装夹具、维修耗材及易损件等物资&#xff0c;已成为保障设备稳定运转、快速处置故障、降低非计划停机损失的核心支撑。尤其在电子制造、半导体、新能源、汽车零部件、电力电气等技术密集型行业&a…...

深度相机三剑客:TOF、双目与结构光的场景化选型指南

1. 深度相机技术入门&#xff1a;从原理到应用 第一次接触深度相机时&#xff0c;我被各种技术名词搞得晕头转向。TOF、双目、结构光听起来都很高大上&#xff0c;但到底有什么区别&#xff1f;经过多年项目实战&#xff0c;我发现这三种技术就像不同的"眼睛"&#…...

大模型动态计算:按需推理更高效

一种让大语言模型更智能地思考难题的方法 这项新技术使大语言模型能够根据问题的难度&#xff0c;动态调整用于推理的计算量。 为了使大语言模型在回答较难问题时更加准确&#xff0c;研究人员可以让模型花费更多时间来思考潜在解决方案。但是&#xff0c;赋予大语言模型这种能…...