【UE4】 第12讲 【MOBA制作日记】 FSocket断线重连
2017-05-06 17:21
1621 查看
(版权声明,禁止转载)
【第03讲】 实现了FSocket的连网基础功能,这一讲实现一下 断线重连
<如果资深前辈发现有理解错误,还请不吝指正>
<1> 创建Socket,设置阻塞模式(默认创建出来的就是阻塞模式,不用设置)
void ANetwork::BeginPlay()
{
Super::BeginPlay();
Socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), false);
// Socket->SetNonBlocking();
//...
}
<2>对网络地址成员变量的存储方式做个调整,从指针改为TSharedPtr,这样保证只需创建一次
class ANetwork
{
//
...
static TSharedPtr<class FInternetAddr> InetAddr;
//...
};
void ANetwork::BeginPlay()
{
//...
FString address = TEXT("119.23.171.163");
int32 port = 8888;
FIPv4Address ip;
FIPv4Address::Parse(address, ip);
TSharedRef<FInternetAddr> addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
addr->SetIp(ip.Value);
addr->SetPort(port);
InetAddr = addr;
}
<3>Connect成功之后,设置为非阻塞模式
bool ANetwork::Connect()
{
if (Socket && !Connected)
{
Connected = Socket->Connect(*InetAddr);
if(Connected)
Socket->SetNonBlocking();
else
{
FPlatformProcess::Sleep(1);
}
}
return Connected;
}
<4>Recv检测到连接断开,重新创建Socket
void ANetwork::Recv()
{
if(Socket)
Connected = Socket->Recv(ptr, 2, BytesRead);
if (!Connected)
{
Socket->Close();
ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(Socket);
Socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), false);
// Socket->SetNonBlocking();
}
}
<5> 如果断开,EventLoop循环Connect
void ANetwork::EventLoop(void* data)
{
while (1)
{
if (!Socket || bGameOver)
{
Close();
break;
}
if (!Connected)
Connect();
if (Connected)
Recv();
FPlatformProcess::Sleep(0.03);
}
}
【第03讲】 实现了FSocket的连网基础功能,这一讲实现一下 断线重连
<如果资深前辈发现有理解错误,还请不吝指正>
<1> 创建Socket,设置阻塞模式(默认创建出来的就是阻塞模式,不用设置)
void ANetwork::BeginPlay()
{
Super::BeginPlay();
Socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), false);
// Socket->SetNonBlocking();
//...
}
<2>对网络地址成员变量的存储方式做个调整,从指针改为TSharedPtr,这样保证只需创建一次
class ANetwork
{
//
...
static TSharedPtr<class FInternetAddr> InetAddr;
//...
};
void ANetwork::BeginPlay()
{
//...
FString address = TEXT("119.23.171.163");
int32 port = 8888;
FIPv4Address ip;
FIPv4Address::Parse(address, ip);
TSharedRef<FInternetAddr> addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
addr->SetIp(ip.Value);
addr->SetPort(port);
InetAddr = addr;
}
<3>Connect成功之后,设置为非阻塞模式
bool ANetwork::Connect()
{
if (Socket && !Connected)
{
Connected = Socket->Connect(*InetAddr);
if(Connected)
Socket->SetNonBlocking();
else
{
FPlatformProcess::Sleep(1);
}
}
return Connected;
}
<4>Recv检测到连接断开,重新创建Socket
void ANetwork::Recv()
{
if(Socket)
Connected = Socket->Recv(ptr, 2, BytesRead);
if (!Connected)
{
Socket->Close();
ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->DestroySocket(Socket);
Socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), false);
// Socket->SetNonBlocking();
}
}
<5> 如果断开,EventLoop循环Connect
void ANetwork::EventLoop(void* data)
{
while (1)
{
if (!Socket || bGameOver)
{
Close();
break;
}
if (!Connected)
Connect();
if (Connected)
Recv();
FPlatformProcess::Sleep(0.03);
}
}
相关文章推荐
- 【UE4】 第08讲 【MOBA制作日记】 实现全方位的行走
- 【UE4】 第11讲 【MOBA制作日记】 HTC Vive设备安装使用及手柄控制漫游
- 【UE4】 第01讲 【MOBA制作日记】 角色攻击事件及发射物
- 【UE4】 第07讲 【MOBA制作日记】 实现自定义的行走控件
- 【UE4】 第04讲 【MOBA制作日记】 隐藏新建工程自带的操作控件
- 【UE4】 第06讲 【MOBA制作日记】 碰撞事件响应
- 【UE4】 第03讲 【MOBA制作日记】 FSocket联网及角色位置同步
- 【UE4】 第05讲 【MOBA制作日记】 发射物方向调整
- 【UE4】 第09讲 【MOBA制作日记】 隐藏默认创建的DefaultPawn
- 【UE4】 第10讲 【MOBA制作日记】 Matinee相机过场动画
- 【UE4】 第02讲 【MOBA制作日记】 安卓打包
- 【TomoEngine】 第十讲 【MOBA制作日记五】 角色技能
- 【TomoEngine】 第九讲 【MOBA制作日记四】 GLES2.0在iPhone5s真机上的纹理限制和GLSLES问题
- 【TomoEngine】 第十一讲 【MOBA制作日记六】 字体渲染
- 【TomoEngine】 第五讲 【MOBA制作日记一】 角色
- 【TomoEngine】 第七讲 【MOBA制作日记二】 角色攻击
- 【TomoEngine】 第八讲 【MOBA制作日记三】 角色行走
- 【TomoEngine】 第十二讲 【MOBA制作日记七】 角色电击效果
- UE4之制作局域网游戏
- UE4制作插件的插件神器pluginCreator