UE Http笔记

c++参考链接

UE4 开发如何使用 Http 请求_wx61ae2f5191643的技术博客_51CTO博客

虚幻引擎:UEC++如何对JSON文件进行读写?-CSDN博客

UE4 HTTP使用

官方免费插件

VaRest

在代码插件创建的VaRest - 虚幻引擎商城

UE5在蓝图中使用Varest插件Get,Post两种常见请求方式_慢慢沉的博客-CSDN博客

UE4使用VaRest插件请求httpAPI以及解析json格式数据_ue4 varest-CSDN博客

示例代码

里面有部分是我测试Http下载文件的代码.所以实际效果很乱.自行理解删减

  • 单纯的Http请求.返回值因为与下面这个下载是同一个Class里面所以是混乱的
  • Http下载文件 UE Http下载文件/解压压缩包_Vince丶的博客-CSDN博客

xxx..Build.cs

"HTTP",
"Json",
"JsonUtilities"
.h

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "Interfaces/IHttpRequest.h"
#include "AsyncHttpObject.generated.h"

#pragma region One

DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FDownloadProgressDelegate,
	const int32&, ReceivedDataInBytes,
	const int32&, TotalDataInBytes,
	const TArray<uint8>&, BinaryData
);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FDownloadDelegate);

#pragma endregion

#pragma region Two

UENUM(BlueprintType)
enum class EPTRequestVerb : uint8
{
	GET,
	POST
};


#pragma endregion
/**
 *
 */
UCLASS()
class PIECETOGETHERTOOLS_API UAsyncHttpObject : public UBlueprintAsyncActionBase
{
	GENERATED_BODY()

public:

#pragma region One
	UFUNCTION(BlueprintCallable, Category = "Vince | AsyncHttp", meta = (BlueprintInternalUseOnly = "true"))
	static UAsyncHttpObject* AsyncHttpDownload(const FString& URL, FString fileSavePath, FString ileSaveName);

	void DownloadRequestStart(const FString& url);
	void DownloadRequestHandle(FHttpRequestPtr request, FHttpResponsePtr response, bool bWasSuccessful);
	void DownloadProgress(FHttpRequestPtr request, int32 bytesSent, int32 bytesReceived);

	//输出节点
	UPROPERTY(BlueprintAssignable, Category = "Vince | AsyncHttp")
	FDownloadProgressDelegate OnProgressUpdate; //最好把有参数的放在前面,不然参数在蓝图节点有时候被吃掉了

	//输出节点
	UPROPERTY(BlueprintAssignable, Category = "Vince | AsyncHttp")
	FDownloadDelegate OnSucc;

	//输出节点
	UPROPERTY(BlueprintAssignable, Category = "Vince | AsyncHttp")
	FDownloadDelegate OnFailed;



#pragma endregion

#pragma region Two

	UFUNCTION(BlueprintCallable, Category = "Vince | AsyncHttp", meta = (BlueprintInternalUseOnly = "true"))
	static UAsyncHttpObject* ConnectAsyncHttp(EPTRequestVerb verb, const FString& URL);

	FString MassageBody = TEXT("");

	void AsyncRequestHandle(FHttpRequestPtr request, FHttpResponsePtr response, bool bWasSuccessful);


#pragma endregion

.cpp

 // Fill out your copyright notice in the Description page of Project Settings.


#include "AsyncHttpObject.h"
#include "HttpModule.h"
#include "Interfaces/IHttpResponse.h"
#include "Misc/Paths.h"
#include "HAL/PlatformFileManager.h"
#include "GenericPlatform/GenericPlatformFile.h"



#pragma region One

//存储目录
FString FileSavePath =TEXT("");

//存储名字
FString FileSaveName = TEXT("");

UAsyncHttpObject* UAsyncHttpObject::AsyncHttpDownload(const FString& URL, FString fileSavePath, FString fileSaveName)
{

	UAsyncHttpObject* AsyncHttpObject = NewObject<UAsyncHttpObject>();
	AsyncHttpObject->DownloadRequestStart(URL);

	FileSavePath = fileSavePath;
	FileSaveName = fileSaveName;

	return AsyncHttpObject;
}

//开始请求下载
void UAsyncHttpObject::DownloadRequestStart(const FString& url)
{
	TSharedRef<IHttpRequest, ESPMode::ThreadSafe> request = FHttpModule::Get().CreateRequest();
	request->SetVerb("GET");
	request->SetURL(url);
	request->OnProcessRequestComplete().BindUObject(this, &UAsyncHttpObject::DownloadRequestHandle); //请求回调
	request->OnRequestProgress().BindUObject(this, &UAsyncHttpObject::DownloadProgress);// 下载进度
	request->ProcessRequest();



	RemoveFromRoot(); // 手动GC
}

请求回调
void UAsyncHttpObject::DownloadRequestHandle(FHttpRequestPtr request, FHttpResponsePtr response, bool bWasSuccessful)
{
	RemoveFromRoot();


	if (bWasSuccessful && response.IsValid() && EHttpResponseCodes::IsOk(response->GetResponseCode()))
	{
		if (response->GetContentLength() > 0) {
			TArray<uint8> EmptyData;
			OnProgressUpdate.Broadcast(response->GetContentLength(), response->GetContentLength(), EmptyData);
		}

		//FString FileSavePath = FPaths::ProjectDir() + "/download/gameplay.png";

	     
		//下载返回类型设置
		FString sType, SLeft, SRight;
		sType = response->GetHeader(TEXT("Content-Type"));
		sType.Split("/",&SLeft,&SRight);
		FileSaveName.Append(FString::Printf(TEXT(".%s"), *SRight)) ;

		//组合 存储地址
		FileSavePath = FPaths::Combine(FileSavePath, FileSaveName);

		FString Path, Filename, Extension;
		FPaths::Split(FileSavePath, Path, Filename, Extension);


		 
		IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();

		if (!PlatformFile.DirectoryExists(*Path))
		{
			if (!PlatformFile.CreateDirectoryTree(*Path))
			{
				UE_LOG(LogTemp, Error, TEXT("Create Directory Failed!"));
				OnFailed.Broadcast();
				return;
			}
		}

		IFileHandle* FileHandle = PlatformFile.OpenWrite(*FileSavePath);
		if (FileHandle)
		{
			FileHandle->Write(response->GetContent().GetData(), response->GetContentLength());
			delete FileHandle;
			OnSucc.Broadcast();
			return;
		}
		else {
			UE_LOG(LogTemp, Error, TEXT("Save File Failed!"));
			OnFailed.Broadcast();
			return;
		}

	}
	UE_LOG(LogTemp, Error, TEXT("download File Failed!"));
	OnFailed.Broadcast();
	return;
}

// 下载进度
void UAsyncHttpObject::DownloadProgress(FHttpRequestPtr request, int32 bytesSent, int32 bytesReceived)
{
	if (request->GetResponse()->GetContentLength() > 0)
	{
		TArray<uint8> EmptyData;
		OnProgressUpdate.Broadcast(bytesReceived, request->GetResponse()->GetContentLength(), EmptyData);
	}
}


UAsyncHttpObject* UAsyncHttpObject::ConnectAsyncHttp(EPTRequestVerb verb, const FString& URL)
{
	UAsyncHttpObject* AsyncHttpObject = NewObject<UAsyncHttpObject>();
	AsyncHttpObject->MassageBody = "";

	if (URL.IsEmpty())
	{
	//	AsyncHttpObject->OnFailed.Broadcast("URL Is Null");
	}


	TSharedRef<IHttpRequest, ESPMode::ThreadSafe> request = FHttpModule::Get().CreateRequest();


	switch (verb)
	{
	case EPTRequestVerb::GET:

		//设置请求方式
		request->SetVerb(TEXT("GET"));
		//设置头
		request->SetHeader(TEXT("Content-Type"), TEXT("application/json;charset=utf-8"));

		break;
	case EPTRequestVerb::POST:


		request->SetVerb(TEXT("POST"));
		request->SetHeader(TEXT("Content-Type"), TEXT("application/x - www-form-urlencoded"));
		break;
	default:
		break;
	}

	//设置URL
	request->SetURL(URL);

	//绑定回调
	request->OnProcessRequestComplete().BindUObject(AsyncHttpObject, &UAsyncHttpObject::AsyncRequestHandle); //请求回调
	request->OnRequestProgress().BindUObject(AsyncHttpObject, &UAsyncHttpObject::DownloadProgress);// 下载进度

	内容
	TSharedRef<FJsonObject> pJsonObject = MakeShared<FJsonObject>();
	TSharedRef<FJsonObject> pJsonObject1 = MakeShared<FJsonObject>();

	//
	//pJsonObject->SetStringField("TD", URL);
	//pJsonObject->SetStringField("TD1", "123");
	//
	pJsonObject1->SetObjectField("TDB",pJsonObject);
	//FString OutputString;
	//TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutputString);
	//FJsonSerializer::Serialize(pJsonObject1, Writer);

	Json内容设置
	//request->SetContentAsString(OutputString);

	//GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Yellow, OutputString, false);


	//请求
	request->ProcessRequest();

	AsyncHttpObject->RemoveFromRoot(); // 手动GC

	return AsyncHttpObject;

}

void UAsyncHttpObject::AsyncRequestHandle(FHttpRequestPtr request, FHttpResponsePtr response, bool bWasSuccessful)
{
	RemoveFromRoot(); // 手动GC

	if (bWasSuccessful && response.IsValid() && EHttpResponseCodes::IsOk(response->GetResponseCode()))
	{
	
		// 获得返回的json数据
		TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(response->GetContentAsString());
		// 把FString转成TCHAR
		TCHAR* serializedChar = response->GetContentAsString().GetCharArray().GetData();
		// 解决中文乱码问题,服务端也是utf-8
		TCHAR_TO_UTF8(serializedChar);
		FString myData(serializedChar);

		// 创建Json对象
		TSharedPtr<FJsonObject> JsonObject;
		// 反序列化json
		bool bIsOk = FJsonSerializer::Deserialize(JsonReader, JsonObject);
		// 判断是否反序列化成功

		if (bIsOk)
		{
			FString data = JsonObject->GetStringField("city");
			//FWHelper::Debug(data);
			UE_LOG(LogTemp, Warning, TEXT("%s"), *data);
			UE_LOG(LogTemp, Warning, TEXT("%s"), *myData);

			FString OutputString;
			TSharedRef<TJsonWriter<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>> Writer = TJsonWriterFactory<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>::Create(&OutputString);
			FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer); //Serialize:把内存中的对象转为便于存储和传输的数据
			//打印
			UE_LOG(LogNet, Warning, TEXT("output 1:\n%s"), *OutputString);

			TSharedPtr<FJsonObject, ESPMode::ThreadSafe> Object = JsonObject->GetObjectField(TEXT("name"));
			TSharedPtr<FJsonObject, ESPMode::ThreadSafe> ObjectField = Object->GetObjectField(TEXT("realtime"));
			FString StringField = ObjectField->GetStringField("text");

		}


	}
}



#pragma endregion



//void UAsyncHttpObject::XieJson(FString& outjsonStr, const UObject* WorldContextObject)
//{
//	// 声明一个存储Json内容的字符串
//	FString JsonStr;
//	//GetJSONStr(JsonStr,WorldContextObject);
//
//	// 创建一个Json编写器
//	TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(&JsonStr);
//	//TSharedRef<TJsonWriter<>> JsonWriter = TJsonWriterFactory<>::Create(&JsonStr);
//
//	// 声明Json对象写入开始
//	JsonWriter->WriteObjectStart();
//	JsonWriter->WriteValue(TEXT("Time"), TEXT("21"));
//
//	// 声明Json数组写入开始
//	JsonWriter->WriteArrayStart(TEXT("Data"));
//	for (int i = 0; i < 2; i++)
//	{
//		JsonWriter->WriteObjectStart();
//		JsonWriter->WriteValue(TEXT("key"), i);
//		JsonWriter->WriteObjectEnd();
//	}
//	JsonWriter->WriteArrayEnd();
//
//	JsonWriter->WriteObjectEnd();
//	// 停止写入
//	JsonWriter->Close();
//
//	UE_LOG(LogTemp, Warning, TEXT("%s"), *JsonStr);
//	outjsonStr = JsonStr;
//
//	GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Yellow, outjsonStr, false);
//}

写入Http请求内容示例

写入Http请求Json内容我自己测试的可以有2种习惯.看自己习惯.c++能力有限.可能描述有误.自行理解把.

第一种直接给 FJsonObject 直接写入 .最后在转成Fstring

内容
TSharedRef<FJsonObject> pJsonObject = MakeShared<FJsonObject>();
TSharedRef<FJsonObject> pJsonObject1 = MakeShared<FJsonObject>();


pJsonObject->SetStringField("TD", URL);
pJsonObject->SetStringField("TD1", "123");

//pJsonObject1->SetObjectField("TDB",pJsonObject);
FString OutputString;
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutputString);
FJsonSerializer::Serialize(pJsonObject1, Writer);

//Json内容设置
request->SetContentAsString(OutputString);

GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Yellow, OutputString, false);

第二种 创建一个Json编写器 直接编写Json.

.h

UFUNCTION(BlueprintCallable, Category = "Vince | AsyncHttp", meta = (WorldContext = "WorldContextObject"))
static	void XieJson(FString& outjsonStr, const UObject* WorldContextObject);

.cpp

void UPieceTogetherToolsBPLibrary::XieJson(FString& outjsonStr, const UObject* WorldContextObject)
{
	// 声明一个存储Json内容的字符串
	FString JsonStr;
	//GetJSONStr(JsonStr,WorldContextObject);

	// 创建一个Json编写器
	TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(&JsonStr);
	//TSharedRef<TJsonWriter<>> JsonWriter = TJsonWriterFactory<>::Create(&JsonStr);

	// 声明Json对象写入开始
	JsonWriter->WriteObjectStart();
	JsonWriter->WriteValue(TEXT("Time"), TEXT("21"));

	// 声明Json数组写入开始
	JsonWriter->WriteArrayStart(TEXT("Data"));
	for (int i = 0; i < 2; i++)
	{
		JsonWriter->WriteValue(TEXT("key"), i);
	}
	JsonWriter->WriteArrayEnd();

	JsonWriter->WriteObjectEnd();
	// 停止写入
	JsonWriter->Close();

	UE_LOG(LogTemp, Warning, TEXT("%s"), *JsonStr);
	outjsonStr = JsonStr;

	GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Yellow, outjsonStr, false);
}
Http接收回调解析数据示例

.cpp

		// 获得返回的json数据
		TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(response->GetContentAsString());
		// 把FString转成TCHAR
		TCHAR* serializedChar = response->GetContentAsString().GetCharArray().GetData();
		// 解决中文乱码问题,服务端也是utf-8
		TCHAR_TO_UTF8(serializedChar);
		FString myData(serializedChar);

		// 创建Json对象
		TSharedPtr<FJsonObject> JsonObject;
		// 反序列化json
		bool bIsOk = FJsonSerializer::Deserialize(JsonReader, JsonObject);
		// 判断是否反序列化成功

		if (bIsOk)
		{
			FString data = JsonObject->GetStringField("city");
			//FWHelper::Debug(data);
			UE_LOG(LogTemp, Warning, TEXT("%s"), *data);
			UE_LOG(LogTemp, Warning, TEXT("%s"), *myData);

			FString OutputString;
			TSharedRef<TJsonWriter<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>> Writer = TJsonWriterFactory<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>::Create(&OutputString);
			FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer); //Serialize:把内存中的对象转为便于存储和传输的数据
			//打印
			UE_LOG(LogNet, Warning, TEXT("output 1:\n%s"), *OutputString);

			TSharedPtr<FJsonObject, ESPMode::ThreadSafe> Object = JsonObject->GetObjectField(TEXT("name"));
			TSharedPtr<FJsonObject, ESPMode::ThreadSafe> ObjectField = Object->GetObjectField(TEXT("realtime"));
			FString StringField = ObjectField->GetStringField("text");

		}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# Solidworks二次开发:三种获取SW设计结构树的方法-第二讲

今天这篇文章是接上一篇文章的&#xff0c;主要讲述的是获取SW设计结构树节点的第二种方法。 这个方法获取节点的逻辑是先获取最顶层节点&#xff0c;然后再通过获取顶层节点的子节点一层一层的把所有节点都找出来&#xff0c;也就是需要递归。想要用这个方法就要了解下面几个…

常见的校验码

在计算机领域中&#xff0c;校验码是一种用于检测或纠正数据传输或存储中错误的技术。校验码通常通过在数据中添加一些冗余信息来实现。其主要目的是确保数据的完整性和准确性。 奇偶校验码&#xff08;Parity Check&#xff09; 奇校验&#xff1a; 确保数据中二进制位中的1的…

JWT安全及WebGoat靶场

JWT 安全 cookie(放在浏览器) cookie 是一个非常具体的东西&#xff0c;指的就是浏览器里面能永久存储的一种数据&#xff0c;仅仅是浏览器实现的一种数据存储功能。 cookie 由服务器生成&#xff0c;发送给浏览器&#xff0c;浏览器把 cookie 以 kv 形式保存到某个目录下的…

文件同步及实现简单监控

1. 软件简介 rsync rsync 是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程 数据同步备份的优秀工具。在同步备份数据时&#xff0c;默认情况下&#xff0c;Rsync 通过其 独特的“quick check”算法&#xff0c;它仅同步大小或者最后修改时间发生变化的文 件或…

CentOS上配置和管理HTTP服务器的工具和实用程序

在CentOS系统上&#xff0c;有多个工具和实用程序可以帮助你配置和管理HTTP服务器。以下是一些常用的工具和实用程序&#xff1a; Apache HTTP服务器&#xff1a; Apache是CentOS上最常用的HTTP服务器之一。它是一个开源的Web服务器软件&#xff0c;具有高度的可配置性和可扩…

在jupyter notebook中修改其他文件的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

dell服务器安装PERCCLI

因在linux 系统中无法查看系统磁盘的raid级别&#xff0c;也无法得知raid状态&#xff0c;需要安装额外的包来监控&#xff0c;因是dell服务器&#xff0c;就在dell网站中下载并安装 1、下载链接&#xff1a;驱动程序和下载 | Dell 中国https://www.dell.com/support/home/zh-…

ELK(四)—els基本操作

目录 elasticsearch基本概念RESTful API创建非结构化索引&#xff08;增&#xff09;创建空索引&#xff08;删&#xff09;删除索引&#xff08;改&#xff09;插入数据&#xff08;改&#xff09;数据更新&#xff08;查&#xff09;搜索数据&#xff08;id&#xff09;&…

查看端口号是否被占用

windows10查看端口号是否被占用及解除占用的常用命令 netstat -ano&#xff1a;查看所有端口号占用情况 netstat -ano |findstr “XXX”&#xff1a;查看端口号为XXX的占用情况&#xff0c;如下&#xff1a; 得到进程号为12160的进程正在占用本地的9090端口号&#xff08;如果只…

Python+requests+unittest+excel实现接口自动化测试框架

在刚刚进入测试行业的时候&#xff0c;最开始也是做功能测试&#xff0c;我想很多伙伴和我一样&#xff0c;觉得自动化测试都很高端&#xff0c;很神秘。迫不及待的想去学习作自动化测试。 以前比较常用数据库python做自动化&#xff0c;后面发现excel个人觉得更加适合&#x…

flex布局的flex为1到底是什么

参考博客&#xff1a;flex:1什么意思_公孙元二的博客-CSDN博客 flex&#xff1a;1即为flex-grow&#xff1a;1&#xff0c;经常用作自适应布局&#xff0c;将父容器的display&#xff1a;flex&#xff0c;侧边栏大小固定后&#xff0c;将内容区flex&#xff1a;1&#xff0c;内…

算术运算(这么简单?进来坐坐?)

先热热身 算术运算&#xff0c;也称为四则运算&#xff0c;包括加法、减法、乘法和除法。此外&#xff0c;算术运算还包括乘方和开方。 在算术中&#xff0c;加减被视为一级运算&#xff0c;乘除被视为二级运算&#xff0c;乘方和开方被视为三级运算。在一道算式中&#xff0c;…

GDPU 数据结构 天码行空13

文章目录 一、【实验目的】二、【实验内容】三、实验源代码四、实验结果五、实验总结 一、【实验目的】 (1) 理解插入排序算法的实现过程&#xff1b; &#xff08;2&#xff09;理解不同排序算法的时间复杂度及适用环境&#xff1b; &#xff08;3&#xff09;了解算法性能…

华为数通---配置Smart Link负载分担案例

定义 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个接口作为另一个的备份。Smart Link常用于双上行组网&#xff0c;提供可靠高效的备份和快速的切换机制。 目的 下游设备连接到上游设备&#xff0c;当使用单上行方式时&#x…

算能 MilkV Duo开发板实战——opencv-mobile (迷你版opencv库)的移植和应用

前言 OpenCV是一种开源的计算机视觉和机器学习软件库&#xff0c;旨在提供一组通用的计算机视觉工具。它用于图像处理、目标识别、人脸识别、机器学习等领域&#xff0c;广泛应用于计算机视觉任务。 OpenCV-Mobile是OpenCV库的轻量版本&#xff0c;专为移动平台&#xff08;A…

服务器感染了.DevicData-D-XXXXXXXX勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 勒索病毒成为网络安全的严峻挑战&#xff0c;而最新的.DevicData-D-XXXXXXXX勒索病毒更是引起广泛关注。本文将深入介绍.DevicData-D-XXXXXXXX勒索病毒的特征&#xff0c;提供恢复被其加密的数据文件的方法&#xff0c;并分享预防措施&#xff0c;以确保您的数…

单细胞seurat-细胞比例分析-画图详细教程

大家好&#xff0c;今天我们来画单细胞中最简单的细胞比例图~ 1.老规矩&#xff0c;先加载pbmc数据 dir.create("~/gzh/细胞比例") setwd("~/gzh/细胞比例")subset_datareadRDS("~/gzh/pbmc3k_final.rds") table(stringr::str_split(string c…

Bounding boxes augmentation for object detection

Different annotations formats Bounding boxes are rectangles that mark objects on an image. There are multiple formats of bounding boxes annotations. Each format uses its specific representation of bouning boxes coordinates 每种格式都使用其特定的边界框坐标…

TCP聊天

一、项目创建 二、代码 Client类 package tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; public class Client { public sta…

Elasticsearch- 环境-Windows集群部署和环境-Linux单节点部署和Linux集群部署-03

Elasticsearch环境 环境-简介 单机 & 集群 单台 Elasticsearch 服务器提供服务&#xff0c;往往都有最大的负载能力&#xff0c;超过这个阈值&#xff0c;服务器性能就会大大降低甚至不可用&#xff0c;所以生产环境中&#xff0c;一般都是运行在指定服务器集群中。除了…
最新文章