千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > UE4 Socket用法介绍

UE4 Socket用法介绍

来源:千锋教育
发布人:xqq
时间: 2023-11-23 17:02:03 1700730123

一、Socket概述

Socket是一种网络通信协议,它是一套用于网络通信的API。Socket可以用来实现不同机器之间的进程通信,也可以用来实现同一机器上不同进程之间的通信。在UE4中,Socket通常用于实现多人在线游戏。

二、Socket连接

Socket连接是指两个Socket之间的通信。在UE4中,Socket连接分为客户端和服务器端。客户端通过连接服务器端的IP和端口号,与服务器建立连接。在Socket连接成功后,客户端和服务器端就可以进行信息的传递。

以下是连接服务器端的Socket客户端的代码实例:


bool UMyClass::ConnectServer(FString IP, int32 Port)
{
    TSharedPtr ListenSocket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), true);
    TSharedPtr Addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
    bool bIsValid;

    // 设置服务器端口号
    Addr->SetPort(Port);

    // 解析服务器IP
    bIsValid = Addr->SetIp(*IP);

    if (!bIsValid)
    {
        return false;
    }

    // 连接服务器
    bool bConnected = ListenSocket->Connect(*Addr);

    return bConnected;
}

三、Socket发送和接收数据

Socket发送和接收数据是Socket连接的核心内容。在UE4中,需要使用FArrayReader和FArrayWriter来进行数据的读取和写入。

以下是向服务器端发送数据的客户端的代码实例:


bool UMyClass::SendData(const FString& Data)
{
    TSharedPtr Socket = GetSocket();

    if (Socket.IsValid())
    {
        int32 BytesSent = 0;
        TArray SendBuffer;

        // 将需要发送的数据写入FArrayWriter
        FArrayWriter Writer(&SendBuffer);
        FString TempData = FString::Printf(TEXT("%s\n"), *Data);
        Writer.Serialize(TCHAR_TO_UTF8(*TempData), TempData.Len());

        // 发送数据
        bool bSuccess = Socket->Send(SendBuffer.GetData(), SendBuffer.Num(), BytesSent);

        return bSuccess;
    }

    return false;
}

以下是接收服务器端数据的客户端的代码实例:


FString UMyClass::ReceiveData()
{
    FString ReceivedData = "";

    TSharedPtr Socket = GetSocket();
    if (Socket.IsValid())
    {
        TArray ReceivedBuffer;
        uint32 Size;

        while (Socket->HasPendingData(Size))
        {
            ReceivedBuffer.SetNumUninitialized(FMath::Min(Size, 65507u));

            int32 BytesRead = 0;
            if (Socket->Recv(ReceivedBuffer.GetData(), ReceivedBuffer.Num(), BytesRead))
            {
                FString Temp = FString(UTF8_TO_TCHAR(reinterpret_cast(ReceivedBuffer.GetData())));
                ReceivedData += Temp;
            }
        }
    }

    return ReceivedData;
}

四、Socket事件

Socket事件是指Socket连接状态发生变化时,程序可以回调进行处理的事件。在UE4中,使用Delegate来处理Socket事件。

以下是Socket事件处理的代码实例:


void UMyClass::InitializeSocket()
{
    TSharedPtr Socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), true);
    FIPv4Address ServerIP(127, 0, 0, 1);
    int32 ServerPort = 12345;
    TSharedPtr ServerAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr(ServerIP.Value, ServerPort);

    Socket->Connect(*ServerAddr);
    Socket->SetNonBlocking(true);

    // 注册Socket事件回调
    Socket->SetConnectCallback(ConnectCallback);
    Socket->SetWriteableCallback(WriteableCallback);
    Socket->SetReadCallback(ReadCallback);
    Socket->SetCloseCallback(CloseCallback);

    // 将Socket添加到每帧都会调用的列表中
    FTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateRaw(this, &UMyClass::PollSocket));
}

void UMyClass::ConnectCallback(const FSocketAddr& NewAddress)
{
    UE_LOG(LogTemp, Display, TEXT("Socket连接成功!"));
}

void UMyClass::WriteableCallback(const FSocketAddr& NewAddress)
{
    UE_LOG(LogTemp, Display, TEXT("Socket可以写入数据!"));
}

void UMyClass::ReadCallback(const FSocketAddr& NewAddress)
{
    UE_LOG(LogTemp, Display, TEXT("Socket接收到数据!"));
}

void UMyClass::CloseCallback(const FSocketAddr& NewAddress, ESocketCloseReason CloseReason)
{
    UE_LOG(LogTemp, Display, TEXT("Socket连接关闭!"));
}

五、网络安全

在多人在线游戏中,网络安全是至关重要的。在UE4中,可以使用SSL(Secure Sockets Layer)来加密Socket通信,提高安全性。

以下是使用SSL加密Socket通信的代码实例:


void UMyClass::InitializeSocket()
{
    TSharedPtr Socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), true);
    FIPv4Address ServerIP(127, 0, 0, 1);
    int32 ServerPort = 12345;
    TSharedPtr ServerAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr(ServerIP.Value, ServerPort);

    // 创建SSL
    TSharedRef SecureSocket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSecureSocket(Socket.ToSharedRef(), TEXT("default"));

    // 连接服务器
    SecureSocket->Connect(*ServerAddr);
    SecureSocket->SetNonBlocking(true);

    // 注册Socket事件回调
    SecureSocket->SetConnectCallback(ConnectCallback);
    SecureSocket->SetWriteableCallback(WriteableCallback);
    SecureSocket->SetReadCallback(ReadCallback);
    SecureSocket->SetCloseCallback(CloseCallback);

    // 将Socket添加到每帧都会调用的列表中
    FTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateRaw(this, &UMyClass::PollSocket));
}

总结

在UE4中,Socket通常用于多人在线游戏的开发。通过Socket连接,可以实现客户端与服务器端之间的通信,以及服务器端与数据库之间的通信。Socket发送和接收数据是Socket连接的核心内容,需要使用FArrayReader和FArrayWriter来进行数据的读取和写入。Socket事件是指Socket连接状态发生变化时,程序可以回调进行处理的事件。在多人在线游戏中,网络安全是至关重要的,可以使用SSL来加密Socket通信,提高安全性。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT