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

Untiy UDP局域网 异步发送图片

同步画面有问题,传图片吧

using System.Text;
using System.Net.Sockets;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using System.Net;
using System;
using System.Threading.Tasks;
using System.Threading;public class UdpNet : MonoBehaviour
{public static UdpNet Instance { get; private set; }/// <summary>/// 默认发送数据最大长度,UDP一次性最大发送长度为65536,也就是64kb/// </summary>const int DEFAULT_SIZE = 60000;public UdpClient udpClient;/// <summary>/// 是否可以发送数据/// </summary>public bool isSend;/// <summary>/// 要发送的数据缓存队列/// </summary>private Queue<NetData> datasBuffer;/// <summary>/// 当前发送的数据/// </summary>private NetData curSendData;/// <summary>/// 数据接收注册方法/// </summary>public UnityAction<byte[]> ReceiveDataAction;/// <summary>/// UDP是否开启/// </summary>public bool IsConnect { get; private set; }/// <summary>/// 数据接收缓存队列/// </summary>public Queue<NetData> receiveBufferQueue;/// <summary>/// 当前接收的缓存数据/// </summary>private NetData curReceiveData;/// <summary>/// 当前发送的数据长度/// </summary> <summary>private int byteLen;/// <summary>/// 当前接收的数据长度/// </summary> <summary>private int receiveLen;public int Port;/// <summary>/// 开启UDP/// </summary>/// <param name="port"></param>public void Init(int port){if (udpClient != null){//Debug.LogWarning("已开启UDP控制端");return;}Port = port;udpClient = new UdpClient(port);datasBuffer = new Queue<NetData>();receiveBufferQueue = new Queue<NetData>();isSend = true;IsConnect = true;ReceiveFile();}/// <summary>/// 关闭UDP/// </summary>void Close(){if (udpClient != null){udpClient.Close();udpClient.Dispose();udpClient = null;IsConnect = false;isSend = false;datasBuffer.Clear();curSendData = null;curReceiveData = null;receiveBufferQueue.Clear();//Debug.Log("UdpNet 已关闭");}}#region Mono方法void Awake(){Instance = this;// Init(Port);}private void Update(){if (!IsConnect){return;}if (isSend && datasBuffer.Count > 0 && curSendData == null){isSend = false;curSendData = datasBuffer.Dequeue();byteLen = 0;int len = curSendData.byteArray.length;if (curSendData.byteArray.length > DEFAULT_SIZE){len = DEFAULT_SIZE;}byteLen += len;byte[] bytes = curSendData.byteArray.Read(len);udpClient.BeginSend(bytes, len, curSendData.iPEndPoint, SendFileAysncCallBack, curSendData);}if (receiveBufferQueue.Count > 0){ReceiveDataAction?.Invoke(receiveBufferQueue.Dequeue().byteArray.bytes);}}void OnDestroy(){Close();}#endregion#region 发送消息public void SendMsg(string msg, string ip, int port){byte[] data = Encoding.UTF8.GetBytes(msg);SendBytes(data, ip, port);}public void SendMsg(string msg, IPEndPoint iPEndPoint){byte[] data = Encoding.UTF8.GetBytes(msg);SendBytes(data, iPEndPoint);}public void SendBytes(byte[] data, string ip, int port){IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);SendBytes(data, iPEndPoint);}public void SendBytes(byte[] data, IPEndPoint iPEndPoint){byte[] bytes = Encode(data);//Debug.Log(bytes.Length);ByteArray byteArray = new ByteArray(bytes);datasBuffer.Enqueue(new NetData(byteArray, iPEndPoint));}private void SendFileAysncCallBack(IAsyncResult ar){try{int count = udpClient.EndSend(ar);if (ar.IsCompleted){curSendData.byteArray.readIdx += count;}else{Debug.Log("发送未成功,重新发送");}if (curSendData.byteArray.length == 0){isSend = true;//Debug.Log("发送完毕,共发送数据: " + byteLen);curSendData = null;return;}int len = curSendData.byteArray.length;if (curSendData.byteArray.length > DEFAULT_SIZE){len = DEFAULT_SIZE;}byte[] bytes;lock (curSendData){bytes = curSendData.byteArray.Read(len);}byteLen += len;//Debug.Log(len);RunThread(bytes, len);}catch (System.Exception e){Debug.LogError(e.Message);Close();return;}}//延迟1毫秒发送已缓解udp无法接收完全的问题async void RunThread(byte[] bytes, int len){await Task.Run(() =>{Thread.Sleep(1);udpClient.BeginSend(bytes, len, curSendData.iPEndPoint, SendFileAysncCallBack, curSendData);});}#endregion#region 接收消息private void ReceiveFile(){udpClient.BeginReceive(ReceiveFileAsyncBackCall, null);}private void ReceiveFileAsyncBackCall(IAsyncResult ar){IPEndPoint remoteIp = null;byte[] data = udpClient.EndReceive(ar, ref remoteIp);receiveLen += data.Length;if (curReceiveData == null){int len = Decode(data, out byte[] conData);curReceiveData = new NetData(new ByteArray(len), remoteIp);// curReceiveData.byteArray.Write(data, 4, data.Length - 4);curReceiveData.byteArray.Write(conData, 0, conData.Length);//Debug.Log($"当前接收数据长度: {receiveLen},总接收数据长度: {receiveLen}, 当前剩余容量: {curReceiveData.byteArray.remain}");}else{int dataLen = data.Length;if (data.Length > curReceiveData.byteArray.remain){dataLen = curReceiveData.byteArray.remain;}curReceiveData.byteArray.Write(data, 0, dataLen);//Debug.Log($"当前接收数据长度: {data.Length},总接收数据长度: {receiveLen}, 当前剩余容量: {curReceiveData.byteArray.remain}");}if (curReceiveData.byteArray.remain == 0){receiveBufferQueue.Enqueue(curReceiveData);//Debug.Log("接收完毕: " + curReceiveData.byteArray.writeIdx);curReceiveData = null;}ReceiveFile();}#endregionprivate static byte[] Encode(byte[] data){byte[] bytes = new byte[data.Length + 4];byte[] byteLen = BitConverter.GetBytes(data.Length);Array.Copy(byteLen, 0, bytes, 0, 4);Array.Copy(data, 0, bytes, 4, data.Length);//Debug.Log(bytes.Length);return bytes;}private static int Decode(byte[] data, out byte[] bytes){byte[] byteLen = new byte[4];Array.Copy(data, 0, byteLen, 0, 4);int len = BitConverter.ToInt32(byteLen);bytes = new byte[data.Length - 4];//Debug.Log("总数据长度: " + (len + 4));//Debug.Log("数据内容长度: " + len);Array.Copy(data, 4, bytes, 0, bytes.Length);return len;}public class NetData{public NetData(ByteArray byteArray, IPEndPoint iPEndPoint){this.byteArray = byteArray;this.iPEndPoint = iPEndPoint;}public ByteArray byteArray;public IPEndPoint iPEndPoint;}
}
using UnityEngine.UI;
using System;[Serializable]
public class ByteArray
{//默认大小const int DEFAULT_SIZE = 4096;//初始大小int initSize = 0;//缓冲区public byte[] bytes;//读写位置public int readIdx = 0;public int writeIdx = 0;//容量private int capacity = 0;//剩余空间public int remain { get { return capacity - writeIdx; } }//数据长度public int length { get { return writeIdx - readIdx; } }//构造函数public ByteArray(int size = DEFAULT_SIZE){bytes = new byte[size];capacity = size;initSize = size;readIdx = 0;writeIdx = 0;}//构造函数public ByteArray(byte[] defaultBytes){bytes = defaultBytes;capacity = defaultBytes.Length;initSize = defaultBytes.Length;readIdx = 0;writeIdx = defaultBytes.Length;}//重设尺寸public void ReSize(int size){if (size < length) return;if (size < initSize) return;int n = 1;while (n < size) n *= 2;capacity = n;byte[] newBytes = new byte[capacity];Array.Copy(bytes, readIdx, newBytes, 0, writeIdx - readIdx);bytes = newBytes;writeIdx = length;readIdx = 0;}//写入数据public int Write(byte[] bs, int offset, int count){// UnityEngine.Debug.Log($"remain: {remain} - bs.Length: {bs.Length} - offset: {offset} - count{count} - bytes.Length: {bytes.Length} - writeIdx: {writeIdx}");if (remain < count){ReSize(length + count);}Array.Copy(bs, offset, bytes, writeIdx, count);writeIdx += count;return count;}//读取数据public int Read(byte[] bs, int offset, int count){count = Math.Min(count, length);Array.Copy(bytes, 0, bs, offset, count);readIdx += count;CheckAndMoveBytes();return count;}//读取数据public byte[] Read(int count){// UnityEngine.Debug.Log($"当前数据长度为 {length},从 {readIdx} 开始读取长度为 {count} 的数据, 剩余数据长度为 {writeIdx - readIdx - count}");byte[] bs = new byte[count];Array.Copy(bytes, readIdx, bs, 0, count);// readIdx += count;return bs;}//检查并移动数据public void CheckAndMoveBytes(){if (length < 8){MoveBytes();}}//移动数据public void MoveBytes(){Array.Copy(bytes, readIdx, bytes, 0, length);writeIdx = length;readIdx = 0;}//读取Int16public Int16 ReadInt16(){if (length < 2) return 0;Int16 ret = BitConverter.ToInt16(bytes, readIdx);readIdx += 2;CheckAndMoveBytes();return ret;}//读取Int32public Int32 ReadInt32(){if (length < 4) return 0;Int32 ret = BitConverter.ToInt32(bytes, readIdx);readIdx += 4;CheckAndMoveBytes();return ret;}//打印缓冲区public override string ToString(){return BitConverter.ToString(bytes, readIdx, length);}//打印调试信息public string Debug(){return string.Format("readIdx({0}) writeIdx({1}) bytes({2})",readIdx,writeIdx,BitConverter.ToString(bytes, 0, capacity));}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
//接收视频画面
public class : MonoBehaviour
{public RawImage rawImage;public int port = 8889;// Start is called before the first frame updatevoid Start(){UdpNet.Instance.Init(port);UdpNet.Instance.ReceiveDataAction += ReceiveDataAction;}private void ReceiveDataAction(byte[] arg0){if (arg0.Length < 1000){Debug.Log(Encoding.UTF8.GetString(arg0));return;}Texture2D texture2D = new Texture2D(10, 10);texture2D.LoadImage(arg0);texture2D.Apply();rawImage.texture = texture2D;Resources.UnloadUnusedAssets();}// Update is called once per framevoid Update(){}
}
using System.Collections;
using System.Collections.Generic;
using System.Net;
using UnityEngine;
using UnityEngine.UI;
//发送视频画面
public class SendWebCameraVideo: MonoBehaviour
{public string deviceName;public WebCamTexture webCam;public RawImage rawImage;public int frames = 30;public string ToIP = "127.0.0.1";public int ToPort = 8889;public int Port = 7777;private IPEndPoint iPEndPoint;public float maxTime;public float timer;public bool send;// Start is called before the first frame updatevoid Start(){UdpNet.Instance.Init(Port);WebCamDevice[] devices = WebCamTexture.devices;deviceName = devices[0].name;RectTransform rawRect = rawImage.GetComponent<RectTransform>();webCam = new WebCamTexture(deviceName, (int)rawRect.sizeDelta.x, (int)rawRect.sizeDelta.y, frames);//设置宽、高和帧率   rawImage.texture = webCam;//渲染脚本所在有RawImage组件的物体maxTime = 1f / frames;iPEndPoint = new IPEndPoint(IPAddress.Parse(ToIP), ToPort);UdpNet.Instance.SendMsg("gogogo", iPEndPoint);}// Update is called once per framevoid Update(){timer += Time.deltaTime;if (timer >= maxTime && send){// send = false;timer = 0;byte[] data = TextureToTexture2D(rawImage.texture).EncodeToJPG();UdpNet.Instance.SendBytes(data, iPEndPoint);// Resources.UnloadUnusedAssets();}}public void Play(){webCam.Play();send = true;}public void Pause(){send = false;webCam.Pause();}/// 运行模式下Texture转换成Texture2Dprivate Texture2D TextureToTexture2D(Texture texture){Texture2D texture2D = new Texture2D(texture.width, texture.height, TextureFormat.RGBA32, false);RenderTexture currentRT = RenderTexture.active;RenderTexture renderTexture = RenderTexture.GetTemporary(texture.width, texture.height, 32);Graphics.Blit(texture, renderTexture);RenderTexture.active = renderTexture;texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);texture2D.Apply();RenderTexture.active = currentRT;RenderTexture.ReleaseTemporary(renderTexture);return texture2D;}}

建两个工程,一个发送一个接收,UdpNet和ByteArray是通用的,每个工程都必须要有
1.发送工程界面
发送工程界面
2.接收界面工程
在这里插入图片描述

相关文章:

Untiy UDP局域网 异步发送图片

同步画面有问题&#xff0c;传图片吧 using System.Text; using System.Net.Sockets; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using System.Net; using System; using System.Threading.Tasks; using Sy…...

移动端H5封装一个 ScrollList 横向滚动列表组件,实现向左滑动

效果&#xff1a; 1.封装组件&#xff1a; <template><div class"scroll-list"><divclass"scroll-list-content":style"{ background, color, fontSize: size }"ref"scrollListContent"><div class"scroll…...

Docker一键安装和基本配置

一键安装脚本 注&#xff1a;该脚本需要root权限 curl -sSL https://get.docker.com/ | sh非root组用户赋权 sudo groupadd docker # 若使用一键安装脚本会自动创建这个组&#xff0c;提示已存在 sudo gpasswd -a ${USER} docker # 将当前用户添加到docker组&#xff0c;也…...

MVC设计思想理解和ASP.NET MVC理解

三层模式 三层模式包括:UI层,业务逻辑层,数据访问层,模型层 MVC设计思想和ASP.NET MVC理解 MVC设计思想: MVC的思想就是把我们的程序分为三个核心的模块,这三个模块的详细介绍如下: 模型(Model) :负责封装与引用程序的业务逻辑相关的数据以及对数据的处理方法。模型层有对…...

大模型应用选择对比

大模型应用选择对比 1、知识库对比&#xff1a;dify、fastgpt、langchatchat 2、agent构建器选择&#xff1a;flowise、langflow、bisheng 3、召回率提升方案...

c++STL概述

目录 STL基本概念 STL六大组件 STL的优点 STL三大组件 容器 算法 迭代器 普通的迭代器访问vector容器元素 算法for_each实现循环 迭代器指向的元素类型是自定义数据类型 迭代器指向容器 常用容器 string容器 string的基本概念 string容器的操作 string的构造函…...

利用容器技术优化DevOps流程

利用容器技术优化DevOps流程 随着云计算的快速发展&#xff0c;容器技术也日益流行。容器技术可以打包和分发应用程序&#xff0c;并实现快速部署和扩展。在DevOps流程中&#xff0c;容器技术可以大大优化开发、测试、部署和运维各个环节。本文将介绍如何利用容器技术优化DevO…...

91 # 实现 express 的优化处理

上一节实现 express 的请求处理&#xff0c;这一节来进行实现 express 的优化处理 让 layer 提供 match 方法去匹配 pathname&#xff0c;方便拓展让 layer 提供 handle_request 方法&#xff0c;方便拓展利用第三方库 methods 批量生成方法性能优化问题 进行路由懒加载&#…...

arcgis拓扑检查实现多个矢量数据之间消除重叠区域

目录 环境介绍&#xff1a; 操作任务&#xff1a; 步骤&#xff1a; 1、数据库和文件结构准备 2、建立拓扑规则 3、一直下一页默认参数后&#xff0c;进行拓扑检查 4、打开TP_CK_Topology&#xff0c;会自动带出拓扑要素&#xff0c;红色区域为拓扑错误的地方&#xff1…...

基于Vue+ELement搭建登陆注册页面实现后端交互

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…...

JS获取经纬度, 并根据经纬度得到城市信息

在JavaScript中&#xff0c;获取经纬度通常需要使用定位服务&#xff0c;比如HTML5的Geolocation API。然而拿到坐标后&#xff0c;将经纬度转换为城市信息&#xff0c;则需要使用逆地理编码服务接口&#xff0c;比如百度或者高德的 API, 但是他们收费都很高, 我们可以使用一些…...

mac m1 docker安装nacos

文章目录 引言I m1安装docker1.1 Docker 下载1.2 终端Docker相关命令II docker安装nacos2.1 安装nacos2.2 镜像启动see alsoMac 查看进程端口引言 使用docker方式安装是最方便的 I m1安装docker 1.1 Docker 下载 https://docs.docker.com/docker-for-mac/apple-silicon/点击…...

位段 联合体 枚举

Hello好久不见&#xff0c;今天分享的是接上次结构体没有分享完的内容&#xff0c;这次我们讲讲位段 枚举和联合体的概念以及他们的用法。 2.1 什么是位段 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 1.位段的成员必须是 int、unsigned int 或signed int 。 …...

PHP循环获取Excel表头字母A-Z,当超过时输出AA,AB,AC,AD······

PHP循环获取Excel表头字母A-Z&#xff0c;当超过时输出AA,AB,AC,AD PHP循环生成Excel的列字母表 $count_num 26 * 27; $letter A; $arr []; while($count_num--){$arr[] $letter;$letter; }结果如下&#xff1a; 转为JSON更为直观&#xff1a; ["A","B&…...

识别准确率达 95%,华能东方电厂财务机器人实践探索

摘 要&#xff1a;基于华能集团公司大数据与人工智能构想理念&#xff0c;结合东方电厂实际工作需要&#xff0c;财务工作要向数字化、智能化纵深推进&#xff0c;随着财务数字化转型和升级加速&#xff0c;信息化水平不断提升&#xff0c;以及内部信息互联互通不断加深&#x…...

代码随想录算法训练营 单调栈part03

一、柱状图中最大的矩形 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 单调栈很重要的性质&#xff0c;就是单调栈里的顺序&#xff0c;是从小到大还是从大到小。 栈顶和栈顶的下一个元素以及要入栈的三个元素组成了我们要求最大面积的高度和宽度&#x…...

使用 MyBatisPlus 的注解方式进行 SQL 查询,它结合了条件构造器(Wrapper)和自定义 SQL 片段来构建查询语句。

MyBatis-Plus 是一个基于 MyBatis 的增强工具&#xff0c;它提供了一套方便的注解方式来进行 SQL 查询。其中&#xff0c;它结合了条件构造器&#xff08;Wrapper&#xff09;和自定义 SQL 片段来构建查询语句。 官网&#xff1a;条件构造器 | MyBatis-Plus 1、使用 Wrapper …...

Python中统计单词出现的次数,包含(PySpark方法)

思路&#xff1a; 定义一个函数&#xff0c;使用open函数&#xff0c;将文本内容打开。 定义一个空字典和空列表&#xff0c;进行循环及条件判断操作def count_word(file_path):dict_data {} #定义一个空字典f open(file_path,"r",encoding"UTF-8")lis…...

探讨基于IEC61499 的分布式 ISA Batch 控制系统

ISA SP88 是批次过程控制的标准&#xff0c;对应的IEC标准是IEC 61512。该标准中一个重要的部分是配方管理&#xff08;Recipe Management&#xff09;。 所谓配方&#xff0c;是根据批量产品的要求&#xff0c;材料设定加工工艺&#xff0c;加工流程和参数。类似于传统制造业的…...

图论16(Leetcode863.二叉树中所有距离为K的结点)

答案&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {public List<Integer> distanceK(TreeNode root, TreeNode tar…...

【小沐学C++】C++ MFC中嵌入64位ActiveX控件(VS2017)

文章目录 1、简介1.1 MFC1.2 ActiveX 2、VS2017添加ActiveX控件结语 1、简介 1.1 MFC Microsoft 基础类 (MFC) 库针对大部分 Win32 和 COM API 提供面向对象的包装器。 虽然此包装器可用于创建极为简单的桌面应用程序&#xff0c;但当你需要开发具有多个控件的更复杂的用户界…...

Linux常用命令—find命令大全

文章目录 一、find命令常用功能1、find命令的基本信息如下。2、按照文件名搜索3、按照文件大小搜索4、按照修改时间搜索5、按照权限搜索举例&#xff1a;6、按照所有者和所属组搜索7、按照文件类型搜索8、逻辑运算符 一、find命令常用功能 1、find命令的基本信息如下。 命令名…...

form组件的封装(element ui ) 简单版本

当你使用Vue.js构建Web应用时&#xff0c;封装可复用组件是提高开发效率和代码可维护性的关键之一。在这篇文章中&#xff0c;我们将探讨如何使用Vue.js来创建一个通用的表单组件&#xff0c;以及如何将它封装成一个可配置的组件。 实现思路 拿下表单模板一个个的改造&#x…...

树形DP杂题

引 对老师布置的题目稍微记录一下吧 也算对树形 D P DP DP 的巩固 T1 Ostap and Tree 题目传送门 由于有 距离 k 距离k 距离k 的限制&#xff0c;设计二维 d p dp dp 设计状态&#xff1a; f i , j : i 的子树内&#xff0c;离 i 最近的染色点与 i 距离为 j 且若 j <…...

Webpack使用plugin插件自动在打包目录生成html文件

我们使用html-webpack-plugin插件可以自动在打包代码目录生成html文件 使用步骤&#xff1a; 一、安装依赖 在控制台中输入如下代码&#xff1a; npm i -D html-webpack-plugin 二、在webpack.config.js中配置插件 const HTMLPlugin require("html-webpack-plugin&q…...

图像处理与计算机视觉--第一章-计算机视觉简介-10问

第一章-计算机视觉简介-10问 1.CV与AI的关系是什么? CV(Computer Vision)是Al的子领域&#xff0c;它致力于使计算机能够理解和解释图像和数据&#xff0c;CV借助AI技术&#xff0c;比如深度学习/机器学习&#xff0c;实现目标识别,分析和处理任务。AI提供了CV所需要的算法…...

LeetCode 80. 删除有序数组中的重复项 II

文章目录 一、题目二、Java 题解 一、题目 给你一个有序数组 nums&#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用…...

【前端面试题】浏览器面试题

文章目录 前言一、浏览器面试问题1.cookie sessionStorage localStorage 区别2.如何写一个会过期的localStorage&#xff0c;说说想法2.如何定时删除localstorage数据2.localStorage 能跨域吗2.memory cache 如何开启2.localstorage的限制2.浏览器输入URL发生了什么2.浏览器如何…...

PHP 生成 PDF文件

参考官网 Example 009 : Image() TCPDF laravel 可以使用 composer 安装 tecnickcom/tcpdf 进行使用 //require_once("../app/Extend/tcpdf/tcpdf.php"); $pdf new TCPDF();// 设置文档信息$pdf->SetCreator(懒人开发网);$pdf->SetAuthor(懒人开发网);$…...

讲讲项目里的仪表盘编辑器(一)

需求 要做一个仪表盘系统&#xff0c;要求有&#xff1a; ① 设计功能&#xff08;包括布局、大小、排列&#xff09; ② 预览功能 ③ 运行功能 布局选择 做编辑器&#xff0c;肯定要先选择布局。 前端有几种常用布局。 静态布局 也叫文档布局。默认的网页形式…...

网站空间数据库需要多大/厦门网站搜索引擎优化

Trie 定义&#xff1a; Trie (字典树)是一种用于实现字符串快速检索的多叉树结构。Trie的每个节点都拥有若于个字符指针&#xff0c;若在插入或检索字符串时扫描到一个字符c, 就沿着当前节点的C字符指针&#xff0c;走向该指针指向的节点。 初始化 一棵空Trie仅包含一个根节点…...

wordpress百度不收录文章/it教育培训机构排名

如果你只是想要一个更好的版本的现有程序&#xff0c;我已经修复了你的代码&#xff0c;并压缩成一个函数如下。但是&#xff0c;我认为编辑你已经写过的东西比重做它更有建设性-有关修复代码的详细信息&#xff0c;请参阅我的回答的其余部分**from random import randintdef m…...

程序员代做网站违法/企业网络推广平台

文|佘凯文 来源|智能相对论&#xff08;aixdlun&#xff09; 618电商大战已经落幕&#xff0c;智能门锁行业看起来盈利了集体狂欢。 但这样的成绩并不足以让行业放松&#xff0c;而且这只是小部分企业的狂欢&#xff0c;其他95%以上的企业并未搭上电商节的东风。 山寨成风&…...

wordpress首页非常慢/互联网推广软件

本文从产品和架构演进、性能及稳定性挑战与优化实践、超级APP运维体系、架构上的容灾规划四个方面分享了支付宝APP亿级用户的性能稳定性优化及运维实践。性能方面&#xff0c;主要介绍了性能、电量、流量、内存、存储五个方面的优化。稳定性方面&#xff0c;主要介绍了Crash优化…...

济南建公司网站/谷歌推广教程

实现memcached的编译安装及将memcached添加为系统服务一.编译安装memcached[plain] view plain copy # yum install libevent libevent-devel -y //memcached借助libevent与客户端通信是来实现的&#xff0c;所以需要先安装libevent,libevent-devel # cd /usr/local/src # wg…...

小程序介绍范文/企业网站seo方案

解除正在死锁的状态有两种方法&#xff1a;第一种&#xff1a;1.查询是否锁表show OPEN TABLES where In_use > 0;2.查询进程(如果您有SUPER权限&#xff0c;您可以看到所有线程。否则&#xff0c;您只能看到您自己的线程)show processlist3.杀死进程id(就是上面命令的id列)…...