全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

UE4 Socket用法介绍

发布时间:2023-11-23 17:02:03
发布人:xqq

一、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通信,提高安全性。

visualassistx破解

相关文章

self.location详解

self.location详解

2023-11-23
kernel.shmmax详解

kernel.shmmax详解

2023-11-23
深入探讨ORA-01092错误

深入探讨ORA-01092错误

2023-11-23
全面window.onblur

全面window.onblur

2023-11-23

最新文章

武汉新媒体行业公司排名

武汉新媒体行业公司排名

2023-11-01
武汉新媒体就业现状好吗

武汉新媒体就业现状好吗

2023-11-01
武汉全媒体行业发展现状及趋势

武汉全媒体行业发展现状及趋势

2023-10-31
武汉全媒体现状

武汉全媒体现状

2023-10-31