代码太多了,直接贴文件路径吧
核心代码就两部分
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_DGram 是 DataGram 的简写,表示是数据报,用于 UDP 连接另外 CreateSocket 还有第三个参数 ProtocolType,有两个属性值 FNetworkProtocolTypes::IPv4 和 FNetworkProtocolTypes::IPv6 分别对应 IPV4 和 IPV6 两个
FSocket 属于网络中最基础的地方,根据不同的平台底层实现不同
比如 FSocketWindows 就是用于 Windows 平台的
是一个比较重要的网络管理类,可以简单看下其结构
在 Listen 函数中会创建 NetDriver、Socket 并绑定
InURL 配置如下,监听接口为 17777
Listen 代码的执行流程如下
默认创建下面这些 Channel,都是继承自 UChannel 基类,用于表示传递某种类型的信息
| Name | 对象 |
|---|---|
| Control | UControlChannel |
| Voice | UVoiceChannel |
| DataStream | UDataStreamChannel |
| Actor | UActorChannel |