README.md 2.5 KB

网络

基本类型

FSocket

代码太多了,直接贴文件路径吧

TestActor.h文件

TestActor.cpp文件

核心代码就两部分

  • 对于客户端来说,主要是 连接 和 发送信息
ISocketSubsystem* System = ISocketSubsystem::Get();

// 创建地址
Addr = System->CreateInternetAddr();
// 创建 Socket
Host = System->CreateSocket(NAME_Stream, TEXT("default"), false);
// 绑定 Socket 和 地址 进行连接
Host->Connect(*Addr);
// 发送信息
Host->Send((uint8*)TCHAR_TO_UTF8(Data), Size, Send);
  • 对于服务器来说,主要是 监听 和 收取信息
ISocketSubsystem* System = ISocketSubsystem::Get();
Socket = System->CreateSocket(NAME_Stream, TEXT("default"), false);
// 绑定 IP 和 端口
Socket->Bind(*Addr);
// 监听事件
Socket->Listen(5);

while(true)
{
    // 检查是否有待处理的连接
    Socket->Wait(ESocketWaitConditions::WaitForRead, FTimespan::FromSeconds(2));

    // 接受新连接
    ClientSocket = Socket->Accept(TEXT("ClientConnection"));

    // 接收数据
    TArray<uint8> ReceiveData;
    ClientSocket->Recv(ReceiveData.GetData(), ReceiveData.Num(), Read);
    FString ReceivedString = FString(UTF8_TO_TCHAR(reinterpret_cast<const char*>(ReceiveData.GetData())));
}

这里 CreateSocket 的参数是 NAME_Stream,除了 NAME_Stream 之外还有 Name_DGram

  • Name_Stream 是数据流,用于 TCP 连接
  • Name_DGramDataGram 的简写,表示是数据报,用于 UDP 连接

另外 CreateSocket 还有第三个参数 ProtocolType,有两个属性值 FNetworkProtocolTypes::IPv4FNetworkProtocolTypes::IPv6 分别对应 IPV4 和 IPV6 两个

FSocket 属于网络中最基础的地方,根据不同的平台底层实现不同

比如 FSocketWindows 就是用于 Windows 平台的

UNetDriver

是一个比较重要的网络管理类,可以简单看下其结构

初始化流程

Server 的初始化流程

Listen 函数中会创建 NetDriverSocket 并绑定

InURL 配置如下,监听接口为 17777

Listen 代码的执行流程如下

Client 的初始化流程

默认创建下面这些 Channel,都是继承自 UChannel 基类,用于表示传递某种类型的信息

Name 对象
Control UControlChannel
Voice UVoiceChannel
DataStream UDataStreamChannel
Actor UActorChannel