非常感谢匿名大哥一直对我的支持,本文内容由他赞助
该Socket可以用于小型或创业型公司的网络服务器,可以用于VR、游戏等领域,代码纯绿色、效率一手自测验证,直接贴代码
如果有遇到断开客户端,服务器无法检测的问题
Socket->GetConnectionState()
判定有问题,可以使用自己的Ping来判定
https://forums.unrealengine.com/t/fsocket-getconnectionstate-always-returns-true/345349/3
UPD Server&Client参考
https://github.com/is-centre/udp-ue4-plugin-win64
#. 使用自定义参数加入Server
void AJoinPlayerController::JoinWithParams(int p1, FString& p2)
{
const FString URLWithParams = FString::Printf(TEXT("127.0.0.1:7777?Param1=%d?Param2=%s"), p1, *p2);
ClientTravel(URLWithParams, ETravelType::TRAVEL_Absolute);
}
FString AJoinServerParamsGameModeBase::InitNewPlayer(APlayerController* NewPlayerController,
const FUniqueNetIdRepl& UniqueId,
const FString& Options,
const FString& Portal)
{
GLog->Logf(TEXT("-------------Options:%s"), *Options);
TArray<FString> Params;
Options.ParseIntoArray(Params, TEXT("?"), true);
int Count = 0;
for (FString Param : Params)
{
FString Key, Value;
Param.Split(TEXT("="), &Key, &Value);
GLog->Logf(TEXT("-------------Param%d>>>[%s]:[%s]"), Count, *Key, *Value);
Count++;
}
return Super::InitNewPlayer(NewPlayerController, UniqueId, Options, Portal);
}
#. UE4.27+新加入FUdpSocketReceiver
int32 BytesSent = 0;
FArrayWriter Writer;
Writer << data;
SenderSocket->SendTo(Writer.GetData(), Writer.Num(), BytesSent, *RemoteAddr);
if (BytesSent <= 0)
{
UE_LOG(LogTemp, Error, TEXT("Socket exists, but receiver did not accept any packets."));
return false;
}
Receiver = new FUdpSocketReceiver(ListenSocket, ThreadWaitTime, TEXT("UDP Receiver"));
Receiver->OnDataReceived().BindUObject(this, &AUDPReceiver::Recv);
Receiver->Start();
FUDPData data;
*ArrayReaderPtr << data;
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Networking.h"
#include "IPAddress.h"
#include "TCPServer.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FTCPEventSignature, int, Port);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FTCPMessageSignature, const TArray<uint8>&, Bytes);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FTCPClientSignture, const FString&, Client);
struct FTCPClient
{
FSocket* Socket;
FString Address;
bool operator == (const FTCPClient& Other)
{
return Address == Other.Address;
}
};
UCLASS(Blueprintable)
class UESOCKET_API ATCPServer : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ATCPServer();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
FTCPMessageSignature OnReceivedBytes;
UPROPERTY(BlueprintAssignable, BlueprintReadWrite)
FTCPEventSignature OnListenBegin;
FTCPEventSignature OnListenEnd;
FTCPClientSignture OnClientConnected;
FTCPClientSignture OnClientDisconnected;
int32 ListenPort;
FString ListenSocketName;
int32 BufferMaxSize;
bool bShouldAutoListen;
bool bReceiveDataOnGameThread;
bool bDisconnectOnFailedEmit;
bool bShouldPing;
float PingInterval;
FString PingMessage;
bool bIsConnected;
void StartListenServer(const FString Ipv4, const int32 InListenPort = 3001);
void StopListenServer()