[Unity3d] 网络开发基础【个人复习笔记/有不足之处欢迎斧正/侵删】
TCP/IP
TCP/IP协议是一 系列规则(协议)的统称,他们定义了消息在网络间进行传输的规则
是供已连接互联网的设备进行通信的通信规则
OSI模型只是一个基本概念,而TCP/IP协议是基于这个概念的具体实现
TCP和UDP协议
TCP:传输控制协议,面向连接,更安全,效率较低,一对一
UDP:用户数据报协议,无连接,不保证可靠性,效率较高,随意组合
TCP
是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接
并且在消息传送过程中是有顺序的,并且是不会丢包(丢弃消息)的
如果某一条消息在传送过程中失败了,会重新发送消息,直到成功
三次握手 四次挥手
三次握手建立连接
第一次握手(C->S)
TCP连接请求
第二次握手(S->C)
TCP授予连接
第三次握手(C->S)
TCP确认连接
四次挥手断开连接
第一次挥手(C->S)
客户端告诉服务器数据已经发完,如果服务器还有消息就请快发完
第二次挥手(S->C)
服务器告诉客户端继续等待服务器的消息
第三次挥手(S->C)
服务器告诉客户端消息发送完成,可以正式断开连接
第四次挥手(C- ->S)
客户端告诉服务器等一会如果没有收到服务器回复就断开 了
提供可靠的服务,通过TCP连接传送的数据,做到无差错、不丢失、不重复、且按顺序到达
UDP
是一种无需建立连接就可以发送封装的IP数据包的方法,提供了面向事务的简单不可靠信息传送服务
具有资源消耗小,处理速度快的特点
UDP协议不像TCP协议需要建立连接有三次握手和四次挥手,当使用UDP协议发送信息时会直接把信息数据扔到网络上,所以也就造成了UDP的不可靠性。信息在这个传递过程中是有可能丢失的虽然UDP是一个不靠谱的协议,但是由于它不需要建立连接。也不会像TCP协议那样携带更多的信息,所以它具有更好的传输效率
网络游戏通信方案
Socket\HTTP\FTP
Socket:网络嵌套字
HTTP:超文本传输协议,主要完成短链接网络游戏需求
FTP:主要用来完成资源的下载和上传
byte [] ipAddress = new byte[]{118,102,111,11};
IPAddress ip1 =new IPAddress(ipAddress);
//用byte进行初始化//使用字符串进行初始化
IPAdress ip =IPAddress.Parse("118.102.111.11");//ipi27.0.0.1代表本机地址//命名空间System.NetIPEndPoint ipPoint =new IPEndPoint(0x79666F0B,8080);
IPEndPoint ipPoint2 =new IPEndPoint(IPAddress.Parse("118.102.111.11"),8080);
域名解析
也叫域名指向,服务器设置,域名配置
域名系统是互联网上的一种服务,管理名字与IP的对应关系
//IPHostEntry类
//域名解析后的返回值,可以获取该对象的IP地址主机名等信息//DNS类
print(Dns.GetHostName());
//获取主机名字//获取指定域名的ip地址
//可能会阻塞主线程
IPHostEntry entry = Dns.GetHostEntry("www.baidu.com");for(int i=0;i<entry.AddressList.Length;i++){print(entry.AddressList[i]);
}
Socket 套接字
c#用于提供网络通信的一个类
类名:Socket 命名空间:System.Net.Socket
Socket套接字时支持TCP/IP网络通信的基本操作单位
一个套接字包括:本机地址IP和端口/对方主机的IP地址和端口/双方通信的协议信息
一个Socket对象表示一个本地或者远程嵌套字信息,可被视为一个数据通道,链接服务器和客户端,可以接受数据的发送和接收
适合长连接的网络游戏
AddressFamily 网络寻址 枚举类型,决定寻址方案
InterNetwork IPv4寻址
InterNetwork6 IPv6寻址
SocketType 嵌套字枚举类型 决定使用的套接字类型
Dgram 支持数据报,最大长度固定,无连接,不可靠的消息(主要用于UDP通信)
Stream 支持可靠、双向、基于连接的字节流(主要用于TCP通信)
ProtocolType 协议类型枚举,决定套接字使用的通信协议
TCP
UDP
流套接字
主要实现TCP通信
数据报套接字
主要实现UDP通信
//TCP流套接字Socket socketTcp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//UDPSocket socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
实现服务端基本逻辑
//创建套接字Socket socketTcp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//用bind方法将套接字与本地地址绑定//端口号要大于1024,且不能被占用IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);try{socketTcp.Bind(ipPoint);}catch (Exception e){return;}//用LISTEN监听socketTcp.Listen(1024);//accept等待客户端连入//建立连接,返回套接字Socket socketClient =socketTcp.Accept();//收发数据socketClient.Send(Encoding.UTF8.GetBytes("HFUT"));byte[] result=new byte[1024];int receiveNum=socketClient.Receive(result);//返回值为接收到的数量socketClient.Shutdown(SocketShutdown.Both);socketClient.Close();
实现客户端基本逻辑
//创建套接字Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//与服务端相连IPEndPoint ipPoint =new IPEndPoint(IPAddress.Parse("127.0.0.0"), 8080);//上述应填写服务端的IP地址try{socket.Connect(ipPoint);}catch(SocketException e) {if(e.ErrorCode ==10061){}else{}}//收发数据byte[] data = new byte[1024];int num = socket.Receive(data);//发送数据socket.Send(Encoding.UTF8.GetBytes("HFUTER"));socket.Shutdown(SocketShutdown.Both);socket.Close();
区分消息类型
发送自定义类的二进制信息(需要继承BaseData类)
区分不同消息:给发送的消息添加标识,比如添加消息ID
例如选择int做消息ID,那么热前四个字节为消息ID,后面为数据类的内容
实现:
1.创建一个消息基类,基类继承BaseData,基类添加获取消息的ID的方法或者属性
2.让想要被发送的消息继承该类,实现序列化反序列化的方法
3.写客户端和服务端收发处理消息的逻辑
分包与黏包
网络通信中由于各种因素造成的消息与消息之间出现的两种状态
分包:一个消息分成了多个消息进行发送
黏包:一个消息和另一个消息黏在一起
两者可能同时发生
解决办法:
可以通过消息的长度来判断是否出现分包或者黏包
为消息添加长度,消息长度记录消息的长度
心跳信息
在长连接中,客户端和服务端之间定期发送的一种特殊数据包,通知对方自己还在线,以保证长连接的有效性
其发送时间间隔是固定的,且持续,因此称之为心跳消息
心跳消息可以避免非正常关闭客户端时,服务器无法正常收到关闭连接消息,同时避免客户端长期不发消息,防火墙或者路由器会断开连接
当客户端主动断开时,服务端无法得知客户端已经主动断开
在客户端中可以使用Disconect方法,看是否因为之前直接Close()从而没有调用Disconect造成服务端无法及时获取状态(仍然无法准确地让服务端得知客户端已经断开连接)
可以考虑自定义退出消息
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class QuitMsg : BaseMsg
{//继承自消息基类//主动发送一条断开连接的消息给服务端//重写函数public override int GetBytesNum(){return 8;}public override int Reading(byte[] bytes, int beginIndex = 0){return 0;}public override byte[] Writing(){int index = 0;byte[] bytes = new byte[GetBytesNum()];WriteInt(bytes, GetID(), ref index);WriteInt(bytes, 0, ref index);return bytes;}public override int GetID(){return 1003;}
}
实现心跳消息
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class HeartMsg : BaseMsg
{//继承消息基类public override int GetBytesNum(){return 8;}public override int Reading(byte[] bytes, int beginIndex = 0){//不需要反序列化任何变量return 0;}public override byte[] Writing(){int index = 0;byte[] bytes = new byte[GetBytesNum()];WriteInt(bytes, GetID(), ref index);WriteInt(bytes, 0, ref index);return bytes;}public override int GetID(){return 999;}
}
客户端:定时发送消息
服务端:收心跳消息 记录收到消息的时间
异步通信
方法中的逻辑还没执行完,便继续执行后面的内容
UNITY中的协同程序中的某系异步方法,有的使用的是多线程有的使用的是迭代器分步执行
//线程回调
public void CountDownAsync(int second, UnityAction callBack){Thread t = new Thread(() =>{while (true){print(second);Thread.Sleep(1000);--second;if (second == 0)break;}
//?的目的是,如果是空的,则不会执行callBack?.Invoke();});t.Start();print("开始倒计时");}//让函数分布执行public async void CountDownAsync(int second){print("倒计时开始");//await->Task通过线程池开启一个线程
//本质上将函数分布执行await Task.Run(() =>{while (true){print(second);Thread.Sleep(1000);--second;if (second == 0)break;}});print("倒计时结束");}
UCP通信
udp不会对数据包进行合并发送,不会出现黏包问题
UDP是不可靠连接,消息传递过程中可能出现无序、丢包等情况
为了避免分包,建议控制消息的大小在MTU(最大传输单元)范围内
MTU:
最大传输单元,用来通知对方所能接受数据服务单元的最大尺寸
局域网:1472字节以内 互联网:548字节以内
如果想要发送的消息过大,可以进行手动分包,但是手动分包的前提是解决UDP的无序和丢包的问题
UDP流程更简单,效率高,但是不可靠
FTP
是支持因特网文件传输的各种规则的集合,使得文件可以被从一台主机拷贝到另一台主机上。此外,FTP还提供登录、文件查询以及其他绘画控制等功能
FTP本质上是TCP通信,通过FTP,双发至少需要简历两个TCP连接,一个称为控制连接,一个成为数据连接
FTP的数据连接和控制连接方向一般是相反的
两种传输方式:1.ASCII传输 2.二进制传输
FTP关键类
1.NetworkCredential 通信凭证类
命名空间:System.Net
用于Ftp文件传输,设置账号密码
NetworkCredrntial n =new NetworkCredrntial("HFUTER","hfuter");
2.FtpWebRequest Ftp文件传输客户端操作类
命名空间:System.Net
用于上传,下载,删除服务器上的文件
3.FtpWebResponse类
FtpWebRequest req = FtpWebRequest.Create(new Uri("ftp://127.0.0.1/Test.txt")) as FtpWebRequest;//创建req.Abort();//停止Stream s= req.GetRequestStream();//获取流对象FtpWebResponse res= req.GetResponse() as FtpWebResponse;//返回FTP服务器响应
HTTP
HTTP超文本传输协议就是一个在网络中上传下载文件的一套规则
其本质也是TCP通信,因此不会丢包、不会乱序
1.以TCP方式工作:
HTTP/1.1支持持久连接(目前使用版本)
2.HTTP是无状态的:
HTTP不会记录客户端请求过的状态
3.元信息作为标头
主要数据前添加一段额外信息
请求类型和相应状态码
HTTP/1.1:GET\POST\HEAD\PUT\......
响应状态码:1xx\2xx\3xx\4xx\5xx
GET:请求获取特定的资源
POST:请求提交数据进行处理
HTTP常用状态码:
200 OK;404 NOT FOUND;405 不支持请求的方法;501 服务器不能识别请求挥着没有实现指定的请求
关键类
HttpWebRequest类:
命名空间:System.Net
HttpWebRequest是主要用于发送客户端请求的类
主要用于:发送HTTP客户端请求给服务器,可以进行消息通信、上传、下载等等操作
//创建新的WebRequest,用于进行HTTP相关操作HttpWebRequest req = HttpWebRequest.Create(new Uri("http://192.168.50.109:8000/Http_Server/")) as HttpWebRequest;//终止传输 req.Abort();//获取用于上传的流Stream s = req.GetRequestStream();//返回HTTP服务器响应HttpWebResponse res = req.GetResponse() as HttpWebResponse;//异步获取用于上传的流req.BeginGetRequestStream()异步获取返回的HTTP服务器响应//req.BeginGetResponse()
HttpWebResponse类:
命名空间:System.Net
主要用于获取服务器反馈信息的类,可以通过HttpWebRequest对象中的GetResponse()方法获取。当使用完毕时,要使用Close释放
POST
上传文件到HTTP资源服务器需要遵守的规则:
1:ContentType = "multipart/form-data; boundary=边界字符串";
2:上传的数据必须按照格式写入流中
3:保证服务器允许上传
4:写入流前需要先设置ContentLength内容长度
WWW类
WWW是Unity提供给程序员简单的访问网页的类,可以通过该类下载和上传一些数据,在使用http协议时,默认的请求类型是Get,如果想要Post上传,需要配合WWWFrom类使用(该类在较新Unity版本中会提示过时,但是仍可以使用,新版本将其功能整合进了UnityWebRequest类)
主要支持的协议:
1.http://和https:// 超文本传输协议
2.ftp:// 文件传输协议(但仅限于匿名下载)
3.file:// 本地文件传输协议,可以使用该协议异步加载本地文件(PC、IOS、Android都支持)
//创建
WWW www = new WWW("");//从下载数据返回一个音效切片AudioClip对象
www.GetAudioClip();//用下载数据中的图像来替换现有的一个Texture2D对象
Texture2D tex = new Texture2D(100, 100);//从缓存加载AB包对象,如果该包不在缓存则自动下载存储到缓存中,以便以后直接从本地缓存中加载
WWW.LoadFromCacheOrDownload("", 1);
UnityWebRequest
是一个Unity提供的一个模块化的系统类,用于构成HTTP请求和处理HTTP响应,主要目标是让Unity游戏和Web服务端进行交互,将之前WWW的相关功能都集成在了其中(新版本中都建议使用UnityWebRequest类来代替WWW类)
注意:
1.UnityWebRequest和WWW一样,需要配合协同程序使用
2.UnityWebRequest和WWW一样,支持http、ftp、file协议下载或加载资源
3.UnityWebRequest能够上传文件到HTTP资源服务器
UnityWebRequest类的常用操作:
//1.获取文本或2进制StartCoroutine(LoadText());//2.获取纹理StartCoroutine(LoadTexture());//3.获取AB包StartCoroutine(LoadAB());IEnumerator LoadText(){UnityWebRequest req = UnityWebRequest.Get("http://192.168.50.109:8000/Http_Server/test.txt");//就会等待 服务器端响应后 断开连接后 再继续执行后面的内容yield return req.SendWebRequest();//如果处理成功 结果就是成功枚举if(req.result == UnityWebRequest.Result.Success){//独立的处理对象print(req.downloadHandler.text);byte[] bytes = req.downloadHandler.data;print("字节数组长度" + bytes.Length);}else{print("获取失败:" + req.result + req.error + req.responseCode);}}IEnumerator LoadTexture(){//UnityWebRequest req = UnityWebRequestTexture.GetTexture("http://192.168.50.109:8000/Http_Server/HFUTER.jpg");//UnityWebRequest req = UnityWebRequestTexture.GetTexture("ftp://127.0.0.1/HFUTER.jpg");UnityWebRequest req = UnityWebRequestTexture.GetTexture("file://" + Application.streamingAssetsPath + "/test.png");yield return req.SendWebRequest();if (req.result == UnityWebRequest.Result.Success){//(req.downloadHandler as DownloadHandlerTexture).texture//DownloadHandlerTexture.GetContent(req)//image.texture = (req.downloadHandler as DownloadHandlerTexture).texture;image.texture = DownloadHandlerTexture.GetContent(req);}elseprint("获取失败" + req.error + req.result + req.responseCode);}IEnumerator LoadAB(){UnityWebRequest req = UnityWebRequestAssetBundle.GetAssetBundle("http://192.168.50.109:8000/Http_Server/lua");req.SendWebRequest();while (!req.isDone){print(req.downloadProgress);print(req.downloadedBytes);
//每帧执行yield return null;}//yield return req.SendWebRequest();print(req.downloadProgress);print(req.downloadedBytes);if (req.result == UnityWebRequest.Result.Success){//AssetBundle ab = (req.downloadHandler as DownloadHandlerAssetBundle).assetBundle;AssetBundle ab = DownloadHandlerAssetBundle.GetContent(req);print(ab.name);}elseprint("获取失败" + req.error + req.result + req.responseCode);}
相关文章:

[Unity3d] 网络开发基础【个人复习笔记/有不足之处欢迎斧正/侵删】
TCP/IP TCP/IP协议是一 系列规则(协议)的统称,他们定义了消息在网络间进行传输的规则 是供已连接互联网的设备进行通信的通信规则 OSI模型只是一个基本概念,而TCP/IP协议是基于这个概念的具体实现 TCP和UDP协议 TCP:传输控制协议,面向连接,…...
Tomcat的配置文件
Tomcat的配置文件详解 一.Tomcat的配置文件 Tomcat的配置文件默认存放在$CATALINA_HOME/conf目录中,主要有以下几个: 1.server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息&#x…...

猴子吃桃问题(python版)
文章预览: 题目python解法一:运行结果 python解法二:运行结果 python解法三:运行结果 题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早…...
C语言入门到精通之练习49:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的 *。
题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的 *。 程序分析:无。 实例 #include<stdio.h> #include<stdlib.h> int main() {int n,i,j;printf("请输入…...
如何在Windows轻量应用服务器上安装和配置SSH?
如何在Windows轻量应用服务器上安装和配置SSH? 检查OpenSSH的可用性:首先,需要以管理员身份打开PowerShell并运行命令Get-WindowsCapability - Online | Where-Object Name - like OpenSSH*来检查OpenSSH服务是否可用。如果服务未启动或不可…...

leetcode日记(36)全排列
想思路想了很久……思路对了应该会很好做。 我的思路是这样的:只变化前n个数字,不断增加n,由2到nums.size(),使用递归直到得到所有结果 代码如下: class Solution { public:vector<vector<int>> permut…...

Flink:动态表 / 时态表 / 版本表 / 普通表 概念区别澄清
博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…...

异常网络下TCP的可靠服务机制(慢启动、拥塞避免、快重传、快恢复)
目录 TCP超时重传拥塞控制概述慢启动和拥塞避免下面讲解发送端如何判断拥塞发生。 快速重传和快速恢复 本文描述TCP在异常网络下的处理方式 以保证其可靠的数据传输的服务 TCP超时重传 tcp服务能够重传其超时时间内没有收到确认的TCP报文段,tcp模块为每一个报文段都…...

PL/SQL执行.sql文件
1.编写.sql文件,创建update.sql文件,文件如下: set feedback off set define off --更新表中所有人的年龄 update a set age18; prompt Done. 2.打开plsql选择命令窗口,即选择File->New->Command Window; 打…...

赋能中国制造,大道云行发布智能制造分布式存储解决方案
《中国制造2025》指出,“制造业是国民经济的主体,是立国之本、兴国之器、强国之基。” 智能制造引领产业提质增效 智能制造是一种利用先进的信息技术、自动化技术和智能技术来优化和升级制造业生产过程的方法。它将人工智能、大数据、物联网、机器学习等…...

MySQL Strict Mode is not set for database connection ‘default‘
在使用 DJango 框架执行迁移文件的命令时,可以看到出现如下警告: (ll_env) D:\workspace\workspace-mengll\learning-log>python manage.py migrate System check identified some issues: WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set …...

分享:大数据信用报告查询的价格一般要多少钱?
现在很多人都开始了解自己的大数据信用了,纷纷去查大数据信用报告,由于大数据信用与人行征信有本质的区别,查询方式和价格都不是固定的,本文就为大家详细讲讲大数据信用报告查询的价格一般要多少钱,希望对你有帮助。 大…...

tomcat下载安装配置教程
tomcat下载安装配置教程 我是使用tomcat下载安装及配置教程_tomcat安装-CSDN博客 此贴来进行安装配置,原文21年已经有些许不同。 下载tomcat 官网:http://tomcat.apache.org/ 我们老师让安装8.5以上,所以我直接选择版本9 点击9页面之后…...
GO—变量
Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性。 我们从计算机系统的角度来讲,变量就是一段或者多段内存,用于存储数据 1.1 标准格式 var 变量名 变量类型 1 …...

【计算机毕业设计】044学生管理系统
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...

揭秘App访问量背后的秘密:数据统计与分析
在移动互联网时代,App已成为人们日常生活的重要组成部分。对于App运营者来说,了解用户的访问量、行为习惯等数据至关重要。本文将深入探讨如何精准统计App访问量,为运营者提供有价值的数据支持。 一、App访问量统计的重要性 访问量是衡量A…...
Qt 样式表
Qt样式表可以在帮助文档中搜索 "Qt Style Sheets" 在帮助文档中可更详细的查阅相关资料。 通常情况下我们需要知道样式表中的各个样式,需要我们查阅官方文档的相关资料; 可以在帮助文档中搜索 "Qt Style Sheets Reference&quo…...

leetcode hot100 每日温度
在本题中,我们是通过单调栈来解决的,因为我们采用了栈的数据结构,并且,栈内存储的元素是单调的。 本题我们考虑,将气温数组元素的下标存入栈中,首先初始化要把0放入,0是下标的意思。然后我们拿…...

【Java EE初阶二十六】简单的表白墙(二)
2. 后端服务器部分 2.1 服务器分析 2.2 代码编写 2.2.2 前端发起一个ajax请求 2.2.3 服务器读取上述请求,并计算出响应 服务器需要使用 jackson 读取到前端这里的数据,并且进行解析: 代码运行图: 2.2.4 回到前端代码,处理服务器返回的响应…...

【wpf】关于绑定的一点明悟
背景简介 软件功能为,读取一个文件夹下的所有子文件夹,每个文件夹对自动对应生成 一组 “按键四个勾选” 按键点击触发,可以发送与其对应文件夹中的一些内容。这个绑定的过程我在之前的文章有过详细的介绍,非常的简单。 这里回顾…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...