UEC++学习(十五)创建、查找、加入会话

news2024/9/25 7:25:50

 创建会话

基于上篇配置steam在线子系统之后,在Character.h中声明一个会话创建完成时的委托以及回调函数。

#include "Interfaces/OnlineSessionInterface.h"


public:
	//指向在线会话界面的指针,将会话接口存储在里面
	TSharedPtr<class IOnlineSession, ESPMode::ThreadSafe> OnlineSessionInterface;

protected:
	//创建游戏会话
	UFUNCTION(BlueprintCallable)
	void CreateGameSession();

	//回调函数,用于处理会话创建完成时的逻辑
	void OnCreateSessionComplete(FName SessionName, bool bWasSuccessful);


private:
	//声明会话创建完成时的委托
	FOnCreateSessionCompleteDelegate CreateSessionCompleteDelegate;

在Character.cpp的构造函数中绑定委托

	//绑定会话创建完成委托
	CreateSessionCompleteDelegate.BindUObject(this, &ThisClass::OnCreateSessionComplete);

添加创建会话逻辑,将结果打印到屏幕

OnlineSessionInterface->GetNamedSession(NAME_GameSession):获取会话

OnlineSessionInterface->DestroySession(NAME_GameSession):销毁会话

OnlineSessionInterface->AddOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegate):添加会话到列表

TSharedPtr<FOnlineSessionSettings> SessionSettings 游戏会话设置

GetWorld()->GetFirstLocalPlayerFromController():获取本地玩家

OnlineSessionInterface->CreateSession:创建会话,参数:网络id,会话名,会话设置

World->ServerTravel():进行服务器旅行

#include "OnlineSessionSettings.h"


void AMenuSystemCharacter::CreateGameSession()
{
	if (!OnlineSessionInterface.IsValid())
	{
		return;
	}
	//通过NAME_GameSession创建一个临时会话
	FNamedOnlineSession* ExistingSession = OnlineSessionInterface->GetNamedSession(NAME_GameSession);
	if (ExistingSession != nullptr)
	{
		//销毁之前的会话
		OnlineSessionInterface->DestroySession(NAME_GameSession);
	}
	//将委托添加到句柄中
	OnlineSessionInterface->AddOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegate);

	//修改游戏会话设置
	TSharedPtr<FOnlineSessionSettings> SessionSettings = MakeShareable(new FOnlineSessionSettings());
	SessionSettings->bIsLANMatch = false;
	SessionSettings->NumPublicConnections = 4;
	SessionSettings->bAllowJoinInProgress = true;
	SessionSettings->bAllowJoinViaPresence = true;
	SessionSettings->bShouldAdvertise = true;
	SessionSettings->bUsesPresence = true;
	//获取本地玩家
	const ULocalPlayer* LocalPlayer = GetWorld()->GetFirstLocalPlayerFromController();
	//将本地玩家的id作为会话房主
	OnlineSessionInterface->CreateSession(*LocalPlayer->GetPreferredUniqueNetId(), NAME_GameSession, *SessionSettings);

}

void AMenuSystemCharacter::OnCreateSessionComplete(FName SessionName, bool bWasSuccessful)
{
	if (bWasSuccessful)
	{
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(
			-1,
			15.f,
			FColor::Blue,
			FString::Printf(TEXT("Created Session: %s"), *SessionName.ToString())
		
			);
		}

		//打开一个空白地图作为服务器大厅
		UWorld* World = GetWorld();
		if (World)
		{
			World->ServerTravel(FString("/Game/ThirdPerson/Maps/Lobby?listen"));
		}

	}
	else
	{
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(
				-1,
				15.f,
				FColor::Red,
				FString(TEXT("Fail to create session"))
			);
		}

	}
}

查找会话

在Character.h中添加查找结束委托以及回调函数

	//加入游戏会话
	UFUNCTION(BlueprintCallable)
	void JoinGameSession();

	void OnFindSessionsComplete(bool bWasSuccessful);

	//声明查找会话完成时的委托
	FOnFindSessionsCompleteDelegate FindSessionCompleteDelegate;

	//会话搜索结果
	TSharedPtr<FOnlineSessionSearch> SessionSearch;

在Character.cpp中,构造函数中绑定委托

	FindSessionCompleteDelegate.BindUObject(this, &ThisClass::OnFindSessionsComplete);

OnlineSessionInterface->FindSessions:查找会话

void AMenuSystemCharacter::JoinGameSession()
{
	if (!OnlineSessionInterface.IsValid())
	{
		return;
	}

	OnlineSessionInterface->AddOnFindSessionsCompleteDelegate_Handle(FindSessionCompleteDelegate);

	SessionSearch = MakeShareable(new FOnlineSessionSearch());
	SessionSearch->MaxSearchResults = 10000;
	SessionSearch->bIsLanQuery = false;
	SessionSearch->QuerySettings.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals);

	const ULocalPlayer* LocalPlayer = GetWorld()->GetFirstLocalPlayerFromController();
	OnlineSessionInterface->FindSessions(*LocalPlayer->GetPreferredUniqueNetId(), SessionSearch.ToSharedRef());

}

void AMenuSystemCharacter::OnFindSessionsComplete(bool bWasSuccessful)
{

	if (!OnlineSessionInterface.IsValid())
	{
		return;
	}
	for (FOnlineSessionSearchResult Result : SessionSearch->SearchResults)
	{
		FString Id = Result.GetSessionIdStr();
		FString User = Result.Session.OwningUserName;
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(
				-1,
				15.f,
				FColor::Cyan,
				FString::Printf(TEXT("Id: %s ,User: %s"),*Id, *User)
			);
		}
	}
}

加入会话

在Character.h中添加 加入会话结束时的委托和回调

	//加入会话结束时的委托
	FOnJoinSessionCompleteDelegate JoinSessionCompleteDelegate;

	void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result);

在构造函数中绑定委托

	JoinSessionCompleteDelegate.BindUObject(this, &ThisClass::OnJoinSessionComplete);

在查找会话阶段的OnFindSessionComplete回调函数中,判断找到的会话类型是否和创建的会话类型一样,如果一样的话就加入会话

Result.Session.SessionSettings.Get(FName("MatchType"), MatchType):获取会话类型

OnlineSessionInterface->JoinSession:加入会话

void AMenuSystemCharacter::OnFindSessionsComplete(bool bWasSuccessful)
{
	if (!OnlineSessionInterface.IsValid())
	{
		return;
	}

	for (FOnlineSessionSearchResult Result : SessionSearch->SearchResults)
	{
		FString Id = Result.GetSessionIdStr();
		FString User = Result.Session.OwningUserName;
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(
				-1,
				15.f,
				FColor::Cyan,
				FString::Printf(TEXT("Id: %s ,User: %s"),*Id, *User)
			);
		}

        //----------判断会话类型
		FString MatchType;
		Result.Session.SessionSettings.Get(FName("MatchType"), MatchType);
		if (MatchType == FString("FreeForAll"))
		{
			if (GEngine)
			{
				GEngine->AddOnScreenDebugMessage(
					-1,
					15.f,
					FColor::Cyan,
					FString::Printf(TEXT("Joining Match Type: %s"), *MatchType)
				);
			}

			//加入会话
			OnlineSessionInterface->AddOnJoinSessionCompleteDelegate_Handle(JoinSessionCompleteDelegate);
			const ULocalPlayer* LocalPlayer = GetWorld()->GetFirstLocalPlayerFromController();
			OnlineSessionInterface->JoinSession(*LocalPlayer->GetPreferredUniqueNetId(), NAME_GameSession, Result);

		}
	}
}

在加入会话结束的回调函数中

 GetGameInstance()->GetFirstLocalPlayerController():获取本地玩家控制器

PlayerController->ClientTravel:作为客户端旅行

void AMenuSystemCharacter::OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result)
{
	if (!OnlineSessionInterface.IsValid())
	{
		return;
	}
	FString Address;
	if (OnlineSessionInterface->GetResolvedConnectString(NAME_GameSession,Address))
	{
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(
				-1,
				15.f,
				FColor::Yellow,
				FString::Printf(TEXT("Connect String : %s"), *Address)
			);
		}
		APlayerController* PlayerController = GetGameInstance()->GetFirstLocalPlayerController();
		if (PlayerController)
		{
			PlayerController->ClientTravel(Address, ETravelType::TRAVEL_Absolute);
		}
	}
}

结果: 

玩家1通过按“1”将自己的id作为会话房主,创建一个会话,打开一个空白地图作为服务大厅,玩家2通过按“2”找到类型匹配的会话并以客户端旅行加入会话,

 玩家1在蓝图中通过按键“1”进行调试,调用CreateGameSession函数。

 玩家2在蓝图中通过按键“2”进行调试,调用JoinGameSession函数

(1)如果是打包出来给两台电脑测试的话,首先需要保证Steam在后台运行,两个不同的steam账号下载地址最好改成一样的。然后一台电脑按1创建房间,另外一台电脑按2加入房间。

(2)如果只有一台电脑测试的话,要将steam退出后台,然后在编辑器中选择“独立进程游戏”,玩家数量改为2。使用局域网来完成,一个玩家按1创建房间,另外一个玩家按2加入房间

如果一直显示无法创建成功的话,需要将DefaultEngin.ini文件进行修改

完整代码

 character.h

#include "Interfaces/OnlineSessionInterface.h"

public:
	//指向在线会话界面的指针,将会话接口存储在里面
	TSharedPtr<class IOnlineSession, ESPMode::ThreadSafe> OnlineSessionInterface;

protected:
	//创建游戏会话
	UFUNCTION(BlueprintCallable)
	void CreateGameSession();

	//加入游戏会话
	UFUNCTION(BlueprintCallable)
	void JoinGameSession();

	//回调函数,用于处理会话创建完成时的逻辑
	void OnCreateSessionComplete(FName SessionName, bool bWasSuccessful);
	void OnFindSessionsComplete(bool bWasSuccessful);
	void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result);

private:
	//声明会话创建完成时的委托
	FOnCreateSessionCompleteDelegate CreateSessionCompleteDelegate;
	//声明查找会话完成时的委托
	FOnFindSessionsCompleteDelegate FindSessionCompleteDelegate;
	//加入会话结束时的委托
	FOnJoinSessionCompleteDelegate JoinSessionCompleteDelegate;

	//会话搜索结果
	TSharedPtr<FOnlineSessionSearch> SessionSearch;

Character.CPP

#include "Kismet/GameplayStatics.h"
#include "OnlineSubsystem.h"
#include "OnlineSessionSettings.h"


//构造函数
AMenuSystemCharacter::AMenuSystemCharacter()
{
	//绑定会话创建完成委托
	CreateSessionCompleteDelegate.BindUObject(this, &ThisClass::OnCreateSessionComplete);
	FindSessionCompleteDelegate.BindUObject(this, &ThisClass::OnFindSessionsComplete);
	JoinSessionCompleteDelegate.BindUObject(this, &ThisClass::OnJoinSessionComplete);
}

//创建会话
void AMenuSystemCharacter::CreateGameSession()
{
	if (!OnlineSessionInterface.IsValid())
	{
		return;
	}
	//通过NAME_GameSession创建一个临时会话
	FNamedOnlineSession* ExistingSession = OnlineSessionInterface->GetNamedSession(NAME_GameSession);
	if (ExistingSession != nullptr)
	{
		//销毁之前的会话
		OnlineSessionInterface->DestroySession(NAME_GameSession);
	}
	//将委托添加到句柄中
	OnlineSessionInterface->AddOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegate);

	//修改游戏会话设置
	TSharedPtr<FOnlineSessionSettings> SessionSettings = MakeShareable(new FOnlineSessionSettings());
	SessionSettings->bIsLANMatch = false;
	SessionSettings->NumPublicConnections = 4;
	SessionSettings->bAllowJoinInProgress = true;
	SessionSettings->bAllowJoinViaPresence = true;
	SessionSettings->bShouldAdvertise = true;
	SessionSettings->bUsesPresence = true;
	SessionSettings->bUseLobbiesIfAvailable = true;
	//设置一个键值队。当找到会话的时候需要检查一下会话类型是否和创建的会话一样
	SessionSettings->Set(FName("MatchType"), FString("FreeForAll"), EOnlineDataAdvertisementType::ViaOnlineServiceAndPing);

	//获取本地玩家
	const ULocalPlayer* LocalPlayer = GetWorld()->GetFirstLocalPlayerFromController();
	//将本地玩家的id作为会话房主
	OnlineSessionInterface->CreateSession(*LocalPlayer->GetPreferredUniqueNetId(), NAME_GameSession, *SessionSettings);

}

//创建会话完成时的回调函数
void AMenuSystemCharacter::OnCreateSessionComplete(FName SessionName, bool bWasSuccessful)
{
	if (bWasSuccessful)
	{
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(
			-1,
			15.f,
			FColor::Blue,
			FString::Printf(TEXT("Created Session: %s"), *SessionName.ToString())
		
			);
		}
		//打开一个空白地图作为大厅
		UWorld* World = GetWorld();
		if (World)
		{
			World->ServerTravel(FString("/Game/ThirdPerson/Maps/Lobby?listen"));
		}

	}
	else
	{
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(
				-1,
				15.f,
				FColor::Red,
				FString(TEXT("Fail to create session"))
			);
		}

	}
}

//查找会话
void AMenuSystemCharacter::JoinGameSession()
{
	if (!OnlineSessionInterface.IsValid())
	{
		return;
	}

	OnlineSessionInterface->AddOnFindSessionsCompleteDelegate_Handle(FindSessionCompleteDelegate);

	SessionSearch = MakeShareable(new FOnlineSessionSearch());
	SessionSearch->MaxSearchResults = 10000;
	SessionSearch->bIsLanQuery = false;
	SessionSearch->QuerySettings.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals);

	const ULocalPlayer* LocalPlayer = GetWorld()->GetFirstLocalPlayerFromController();
	OnlineSessionInterface->FindSessions(*LocalPlayer->GetPreferredUniqueNetId(), SessionSearch.ToSharedRef());

}

//查找会话完成时的回调函数
void AMenuSystemCharacter::OnFindSessionsComplete(bool bWasSuccessful)
{
	if (!OnlineSessionInterface.IsValid())
	{
		return;
	}

	for (FOnlineSessionSearchResult Result : SessionSearch->SearchResults)
	{
		FString Id = Result.GetSessionIdStr();
		FString User = Result.Session.OwningUserName;
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(
				-1,
				15.f,
				FColor::Cyan,
				FString::Printf(TEXT("Id: %s ,User: %s"), *Id, *User)
			);
		}

		//----------判断会话类型
		FString MatchType;
		Result.Session.SessionSettings.Get(FName("MatchType"), MatchType);
		if (MatchType == FString("FreeForAll"))
		{
			if (GEngine)
			{
				GEngine->AddOnScreenDebugMessage(
					-1,
					15.f,
					FColor::Cyan,
					FString::Printf(TEXT("Joining Match Type: %s"), *MatchType)
				);
			}

			//加入会话,
			OnlineSessionInterface->AddOnJoinSessionCompleteDelegate_Handle(JoinSessionCompleteDelegate);
			const ULocalPlayer* LocalPlayer = GetWorld()->GetFirstLocalPlayerFromController();
			OnlineSessionInterface->JoinSession(*LocalPlayer->GetPreferredUniqueNetId(), NAME_GameSession, Result);

		}
	}
}

//加入会话完成时的回调函数
void AMenuSystemCharacter::OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result)
{
	if (!OnlineSessionInterface.IsValid())
	{
		return;
	}

	FString Address;
	if (OnlineSessionInterface->GetResolvedConnectString(NAME_GameSession,Address))
	{
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(
				-1,
				15.f,
				FColor::Yellow,
				FString::Printf(TEXT("Connect String : %s"), *Address)
			);
		}
		APlayerController* PlayerController = GetGameInstance()->GetFirstLocalPlayerController();
		if (PlayerController)
		{
			PlayerController->ClientTravel(Address, ETravelType::TRAVEL_Absolute);
		}
	}
}

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

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

相关文章

Spring AOP(概念,使用)

目录 Spring AOPAOP是什么什么是Spring AOPAOP实际开发流程1. 引入依赖2. 编写AOP程序 Spring AOP详解Spring AOP中的核心概念Spring AOP的通知类型六种类型PointCutOrder(切面优先级) Spring AOP AOP是什么 Aspect Oriented Programminig(面向切面编程)切面指的是某一类特定…

Keli5烧写程序成功后再次烧写程序却不能识别芯片。解决方法

1问题&#xff08;已排除硬件问题和Debug配置问题&#xff09; 再次烧写不能识别下如图&#xff08;提示为不能识别到芯片&#xff09; 硬件识别正常 Debug配置正常 就是不能识别到芯片 2为什么会出现这个问题 在STM32Cude设置中没有设置SYS&#xff08;默认是No Debug&…

如何判断点在多边形内部:OpenCV--cv2.pointPolygonTest()方法详解

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

HTML常用标签-超链接标签

超链接标签 点击后带有链接跳转的标签 ,也叫作a标签 href属性用于定义连接 href中可以使用绝对路径,以/开头,始终以一个固定路径作为基准路径作为出发点href中也可以使用相对路径,不以/开头,以当前文件所在路径为出发点href中也可以定义完整的URL target用于定义打开的方式 _b…

照片误删如何恢复?这些方法帮你重拾回忆!

手机照片是我们记录美好时刻的重要工具。但有时我们会因为不小心或者错误操作而导致珍贵照片的丢失。那些与家人、朋友共度的美好时刻、旅途中的风景、重要的纪念日&#xff0c;一旦删除&#xff0c;就如同从记忆中抹去&#xff0c;令人惋惜不已。幸运的是&#xff0c;随着科技…

【AI智能体】零代码构建AI应用,全网都在喊话歌手谁能应战,一键AI制作歌手信息查询应用

欢迎来到《小5讲堂》 这是《文心智能体平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 文心智能体大赛背景创建应用平台地址快速构建【基础配置】…

利用关系感知一致性和虚拟特征补偿解决医学分类中的长尾问题

文章目录 Combat Long-Tails in Medical Classification with Relation-Aware Consistency and Virtual Features Compensation摘要方法实验结果 Combat Long-Tails in Medical Classification with Relation-Aware Consistency and Virtual Features Compensation 摘要 由于…

Blender使用python代码绘画:一个简单例子

Blender简介 Blender 是一款开源的三维计算机图形软件&#xff0c;它提供了广泛的功能&#xff0c;包括建模、动画、渲染、视频编辑等。Blender还支持Python编程接口&#xff0c;允许用户通过编写脚本来控制和定制软件的各个方面。 Blender的功能非常强大&#xff0c;它被广泛…

MySQL和吉客云单据接口对接

MySQL和吉客云单据接口对接 源系统:吉客云 杭州吉客云网络技术有限公司是经国家认定的高新技术企业&#xff0c;是国内领先的SaaSERP软件服务商&#xff0c;致力于为企业提供安全稳定、高可用性和高扩展性的一站式数字化解决方案。 写入目标:MySQL MySQL是最流行的数据库之一&a…

【C语言】水仙花数

问题 水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数或阿姆斯壮数数&#xff08;Armstrong number&#xff09;。 它是指一个n位数&#xff08;n≥3&#xff09;…

推荐系统学习笔记(一)

A/B测试 随机分桶--哈希函数随机分 如果某个实验组指标明显优于对照组&#xff0c;则值得推全 分层实验 问题&#xff1a;流量不够用怎么办&#xff1f; 同层互斥----避免一个用户被两个实验影响 不同层正交----每层独立随机分配用户 为什么不能全都用正交&#xff1f; 同…

【机器学习:IT行业的现在与未来】技术应用与趋势探索

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f381; 引言&#x1f300; 当前机器学习技术的深度剖析与实践展示&#x1f3af; 算法与架构的革新轨迹&#x1f4c8; 数据科学与基础设施的融合进化&#x1f512; 安全、隐私与伦理&#xff1a;技术的道德指南针&…

【Maven】简介_下载安装

1.maven简介 项目管理工具项目对象模型 project object model (POM) 一个项目&#xff1a;清理、编译、测试、打包、发布、部署 1.1 为什么需要使用maven 组装机和品牌机的概念IDE &#xff08;集成开发环境&#xff09;不是万能的依赖大量的手工操作&#xff0c;编译、测试、…

Odin:免费轻量化BAS工具,守护企业网络安全新利器!

墨云科技依托多年安全验证经验积累&#xff0c;推出免费轻量化安全验证工具——Odin。墨云Odin安全验证工具从设计上极大的简化了BAS的任务流程&#xff0c;专为企业持续安全运营设计&#xff0c;提供轻量化、全方位的安全策略有效性验证。 Odin提供综合攻击模拟服务&#xff0…

scratch求和 2024年3月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch求和 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、pytho…

Spring MVC(一)

1 Spring MVC概述 我们在之前学习Servlet的时候&#xff0c;认识了在WEB开发中MVC设计模式&#xff0c;其最为经典的设计就是&#xff0c;通过控制器&#xff08;Controller&#xff09;分离模型&#xff08;Model&#xff09;和视图&#xff08;View&#xff09;。在具体的WEB…

【408精华知识】计算机系统结构

感觉教材和网络上对于计算机系统的结构描述都比较模糊&#xff0c;我自己对其进行了总结&#xff0c;并且画出图&#xff0c;不过因为学习的还是不够深入和全面&#xff0c;有的地方肯定是有问题的&#xff0c;烦请大家批评指正&#xff0c;我会进行修改~ 文章目录 零、结构图总…

OpenAI 新发布的 GPT-4o,有血有肉的Ai来了,可实时语音视频交互

今天&#xff0c;OpenAI又又又开发布会了。 在大众心里&#xff0c;现在也基本上都知道&#xff0c;奥特曼是一个贼能PR的人。 每一次的PR的时间点&#xff0c;都拿捏的极其到位&#xff0c;精准的狙击其他厂商。比如说上一次Sora&#xff0c;其实你会发现从头到尾就是一个PR的…

中腾食品上海食堂承包创新食堂空间,构建企业第三文化沙龙

在快节奏的现代职场生活中&#xff0c;企业食堂已不再是简单的餐饮供应地&#xff0c;而是逐渐演变成为员工休息休闲、互动体验、阅读思考的重要场所。中腾国际团餐产业集团通过专业的定制化食堂承包&#xff0c;在企业食堂内部打造企业第三文化空间&#xff0c;为员工提供一个…

基于ProxySQL中间件实现MySQL的读写分离

目录 ProxySQL简介 ProxySQL安装 配置YUM仓库 YUM安装 关于读写分离的实现 集群信息 测试读写分离 测试总结 ProxySQL Configuration CLI ProxySQL简介 ProxySQL是一个高性能的MySQL协议代理&#xff0c;它支持多种数据库后端&#xff0c;包括Amazon Aurora、RDS、Cl…