C++
Aggiunta del modulo
Apri il tuo file di configurazione della build sorgente (<ProjectName>.Build.cs) e aggiungi la dipendenza del modulo nei tuoi elenchi di istruzioni di compilazione:
PublicDependencyModuleNames.Add("BlueprintWebSocket");
Includi
Esponi i tipi di interfaccia posizionando l'header wrapper nel tuo file di classe:
#include "BlueprintWebSocketWrapper.h"
Creazione di un nuovo WebSocket
Istanzia un'allocazione heap usando il metodo factory del plugin:
UBlueprintWebSocket* const WebSocket = UBlueprintWebSocket::CreateWebSocket();
Configurazione del WebSocket
Modifica le strutture dei metadati di trasporto e gli header di autenticazione prima di invocare la routine di handshake di connessione:
// Unisce la map fornita con l'elenco di header corrente.
WebSocket->SetHeaders(const TMap<FString, FString> & InHeaders);
// Aggiunge una coppia Chiave / Valore all'elenco di header.
WebSocket->AddHeader(const FString & Header, const FString & Value);
// Rimuove l'header dall'elenco di header
WebSocket->RemoveHeader(const FString & HeaderToRemove);
Ascolto degli eventi con Callback
Associa target funzionali ai delegate asincroni per ricevere in modo sicuro le modifiche di stato delle risposte di rete:
| Nome evento
| Firma
| Descrizione
|
OnConnectedEvent
| void Func()
| Chiamato quando siamo connessi con successo al server WebSocket.
|
OnConnectionErrorEvent
| void Func(const FString & Error)
| Chiamato quando non siamo riusciti a connetterci al server WebSocket.
|
OnCloseEvent
| void Func(int64 StatusCode, const FString & Reason, bool bWasClean)
| Chiamato quando la connessione con il server è stata chiusa.
|
OnMessageEvent
| void Func(const FString & Message)
| Chiamato quando abbiamo ricevuto un messaggio di stringa.
|
OnRawMessageEvent
| void Func(const TArray<uint8> & Data, int32 BytesRemaining)
| Chiamato quando abbiamo ricevuto un messaggio binario.
|
OnMessageSentEvent
| void Func(const FString & Message)
| Chiamato subito dopo aver inviato un messaggio.
|
Poiché questi hook utilizzano Dynamic Multicast Delegates, qualsiasi funzione listener associata deve portare la macro di decorazione UFUNCTION() per rimanere visibile all'interno dello stack di invocazione del motore:
UCLASS()
class MYGAME_API UMyClass : public UObject
{
GENERATED_BODY()
public:
// La funzione che usiamo per associare gli eventi
void BindEvents();
private:
// Callback
UFUNCTION() void OnConnected();
UFUNCTION() void OnConnectionError(const FString & Error);
UFUNCTION() void OnClosed(int64 StatusCode, const FString & Reason, bool bWasClean);
UFUNCTION() void OnMessage(const FString & Message);
UFUNCTION() void OnRawMessage(const TArray<uint8> & Data, int32 BytesRemaining);
UFUNCTION() void OnMessageSent(const FString & Message);
private:
UPROPERTY()
UBlueprintWebSocket* WebSocket;
};
void UMyClass::BindEvents()
{
// Associa gli eventi in modo che le nostre funzioni vengano chiamate quando l'evento viene attivato.
WebSocket->OnConnectedEvent .AddDynamic(this, &UMyClass::OnConnected);
WebSocket->OnConnectionErrorEvent.AddDynamic(this, &UMyClass::OnConnectionError);
WebSocket->OnCloseEvent .AddDynamic(this, &UMyClass::OnClosed);
WebSocket->OnMessageEvent .AddDynamic(this, &UMyClass::OnMessage);
WebSocket->OnRawMessageEvent .AddDynamic(this, &UMyClass::OnRawMessage);
WebSocket->OnMessageSentEvent .AddDynamic(this, &UMyClass::OnMessageSent);
}
Nota: Si consiglia di associare tutti gli eventi che utilizzerai prima di connetterti.
Connessione al server WebSocket
Passa l'URI endpoint esplicito e le sotto-stringhe del protocollo di comunicazione direttamente nel ciclo di elaborazione della connessione:
WebSocket->Connect(TEXT("ws://127.0.0.1:8080/"), TEXT("ws"));
Interroga i frame di stato inline tramite i controllori di stato funzionali:
if (WebSocket->IsConnected())
{
// Siamo connessi.
}
else
{
// Non siamo connessi.
}
Nota: Non dovresti fare affidamento su IsConnected() per gestire la connessione ma sul callback OnConnectedEvent .
Invio di messaggi
Trasmetti informazioni a valle usando stringhe strutturate o buffer di memoria diretti:
void SendMessage(const FString & Message): per passare formati di dati testuali/JSON.
void SendRawMessage(const TArray<uint8> & Message, const bool bIsBinary): per inviare strutture compresse o file di risorse.
Esempio di implementazione:
// I dati che vogliamo inviare, puoi ottenerli programmaticamente.
const FString StringMessage = TEXT("Hello Server");
const TArray<uint8> BinaryMessage = { 0, 1, 2, 3, 4, 5 };
// Inviali attraverso il nostro WebSocket.
WebSocket->SendMessage (StringMessage);
WebSocket->SendRawMessage(BinaryMessage);
Esempio completo
MyClass.h
#pragma once
#include "CoreMinimal.h"
#include "MyClass.generated.h"
class UBlueprintWebSocket;
/**
* La nostra classe personalizzata che utilizza un WebSocket.
**/
UCLASS()
class MYGAME_API UMyClass : public UObject
{
GENERATED_BODY()
public:
void InitializeAndConnectSocket();
private:
UFUNCTION()
void OnConnected();
UFUNCTION()
void OnConnectionError(const FString & Error);
UFUNCTION()
void OnClosed(int64 StatusCode, const FString & Reason, bool bWasClean);
UFUNCTION()
void OnMessage(const FString & Message);
UFUNCTION()
void OnRawMessage(const TArray<uint8> & Data, int32 BytesRemaining);
UFUNCTION()
void OnMessageSent(const FString & Message);
private:
UPROPERTY()
UBlueprintWebSocket* WebSocket;
};
MyClass.cpp
#include "MyClass.h"
#include "BlueprintWebSocketWrapper.h"
void UMyClass::InitializeAndConnectSocket()
{
WebSocket = UBlueprintWebSocket::CreateWebSocket();
WebSocket->OnConnectedEvent .AddDynamic(this, &UMyClass::OnConnected);
WebSocket->OnConnectionErrorEvent.AddDynamic(this, &UMyClass::OnConnectionError);
WebSocket->OnCloseEvent .AddDynamic(this, &UMyClass::OnClosed);
WebSocket->OnMessageEvent .AddDynamic(this, &UMyClass::OnMessage);
WebSocket->OnRawMessageEvent .AddDynamic(this, &UMyClass::OnRawMessage);
WebSocket->OnMessageSentEvent .AddDynamic(this, &UMyClass::OnMessageSent);
WebSocket->AddHeader(TEXT("SomeHeader"), TEXT("SomeValue"));
WebSocket->Connect(TEXT("ws://127.0.0.1:8080/"), TEXT("ws"));
}
void UMyClass::OnConnected()
{
UE_LOG(LogTemp, Log, TEXT("We are connected!"));
WebSocket->SendMessage(TEXT("Hello Server!"));
}
void UMyClass::OnConnectionError(const FString & Error)
{
UE_LOG(LogTemp, Error, TEXT("Failed to connect: %s."), *Error);
}
void UMyClass::OnClosed(int64 StatusCode, const FString & Reason, bool bWasClean)
{
UE_LOG(LogTemp, Warning, TEXT("Connection closed: %d:%s. Clean: %d"), StatusCode, *Reason, bWasClean);
}
void UMyClass::OnMessage(const FString & Message)
{
UE_LOG(LogTemp, Log, TEXT("New message: %s"), *Message);
}
void UMyClass::OnRawMessage(const TArray<uint8> & Data, int32 BytesRemaining)
{
UE_LOG(LogTemp, Log, TEXT("New binary message: %d bytes and %d bytes remaining."), Data.Num(), BytesRemaining);
}
void UMyClass::OnMessageSent(const FString & Message)
{
UE_LOG(LogTemp, Log, TEXT("We just sent %s to the server."), *Message);
}