C++
モジュールの追加
ソースビルド構成ファイル (<ProjectName>.Build.cs) を開き、コンパイル命令リストにモジュール依存関係を追加します:
PublicDependencyModuleNames.Add("BlueprintWebSocket");
インクルード
ラッパーヘッダーをクラスファイルに配置して、インターフェース型を公開します:
#include "BlueprintWebSocketWrapper.h"
新しい WebSocket の作成
プラグインファクトリメソッドを使用してヒープ割り当てをインスタンス化します:
UBlueprintWebSocket* const WebSocket = UBlueprintWebSocket::CreateWebSocket();
WebSocket の構成
接続ハンドシェイクルーチンを呼び出す前に、トランスポートメタデータ構造と認証ヘッダーを変更します:
// 提供されたマップを現在のヘッダーリストとマージします。
WebSocket->SetHeaders(const TMap<FString, FString> & InHeaders);
// ヘッダーリストにキー / 値のペアを追加します。
WebSocket->AddHeader(const FString & Header, const FString & Value);
// ヘッダーリストからヘッダーを削除します
WebSocket->RemoveHeader(const FString & HeaderToRemove);
コールバックでイベントをリッスンする
関数ターゲットを非同期デリゲートにバインドして、ネットワーク応答の状態変更を安全に受信します:
| イベント名
| シグネチャ
| 説明
|
OnConnectedEvent
| void Func()
| WebSocket サーバーに正常に接続したときに呼び出されます。
|
OnConnectionErrorEvent
| void Func(const FString & Error)
| WebSocket サーバーへの接続に失敗したときに呼び出されます。
|
OnCloseEvent
| void Func(int64 StatusCode, const FString & Reason, bool bWasClean)
| サーバーとの接続が閉じられたときに呼び出されます。
|
OnMessageEvent
| void Func(const FString & Message)
| 文字列メッセージを受信したときに呼び出されます。
|
OnRawMessageEvent
| void Func(const TArray<uint8> & Data, int32 BytesRemaining)
| バイナリメッセージを受信したときに呼び出されます。
|
OnMessageSentEvent
| void Func(const FString & Message)
| メッセージを送信した直後に呼び出されます。
|
これらのフックは Dynamic Multicast Delegatesを使用するため、バインドされたリスナー関数は UFUNCTION() 装飾マクロを持ち、エンジン呼び出しスタック内で表示され続ける必要があります:
UCLASS()
class MYGAME_API UMyClass : public UObject
{
GENERATED_BODY()
public:
// イベントをバインドするために使用する関数
void BindEvents();
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;
};
void UMyClass::BindEvents()
{
// イベントをバインドして、イベントがトリガーされたときに関数が呼び出されるようにします。
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 サーバーへの接続
明示的なエンドポイント URI と通信プロトコルサブ文字列を接続処理ループに直接渡します:
WebSocket->Connect(TEXT("ws://127.0.0.1:8080/"), TEXT("ws"));
機能ステータスチェッカーを介して状態フレームをインラインでクエリします:
if (WebSocket->IsConnected())
{
// 接続されています。
}
else
{
// 接続されていません。
}
注意: 接続の処理には IsConnected() に依存せず、 OnConnectedEvent コールバックに依存する必要があります。
メッセージの送信
構造化文字列または直接メモリバッファを使用して情報をダウンストリームに送信します:
void SendMessage(const FString & Message): テキスト/JSON データ形式を渡すため。
void SendRawMessage(const TArray<uint8> & Message, const bool bIsBinary): 圧縮構造またはアセットファイルをプッシュするため。
実装サンプル:
// 送信したいデータ。プログラムで取得できます。
const FString StringMessage = TEXT("Hello Server");
const TArray<uint8> BinaryMessage = { 0, 1, 2, 3, 4, 5 };
// WebSocket を介して送信します。
WebSocket->SendMessage (StringMessage);
WebSocket->SendRawMessage(BinaryMessage);
完全な例
MyClass.h
#pragma once
#include "CoreMinimal.h"
#include "MyClass.generated.h"
class UBlueprintWebSocket;
/**
* 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);
}