Hi, I’m trying to create a WebSocket client in Unreal to communicate with my server. When I run the connection, it works — the log shows it, and on my server side I can see the client in the list. But after that, when I try to send a message from the server to the client, it doesn’t work. I don’t know why.
Here is my script:
cpp
UWebSocketClient* UWebSocketClient::CreateWebSocketClient(
UObject* WorldContextObject,
const FString& Role)
{
UWebSocketClient* Client = NewObject<UWebSocketClient>(WorldContextObject);
Client->ClientRole = Role;
// Auto connect
Client->ConnectInternal();
return Client;
}
void UWebSocketClient::ConnectInternal()
{
if (!FModuleManager::Get().IsModuleLoaded("WebSockets"))
{
FModuleManager::LoadModuleChecked<FWebSocketsModule>("WebSockets");
}
Socket = FWebSocketsModule::Get().CreateWebSocket(Url);
Socket->OnConnected().AddUObject(this, &UWebSocketClient::OnConnected);
Socket->OnConnectionError().AddUObject(this, &UWebSocketClient::OnConnectError);
Socket->OnClosed().AddUObject(this, &UWebSocketClient::OnClosed);
Socket->OnMessage().AddUObject(this, &UWebSocketClient::OnMessage);
Socket->Connect();
}
void UWebSocketClient::OnConnected()
{
FString RegisterMsg = FString::Printf(TEXT("REGISTER:%s"), *ClientRole);
UE_LOG(LogTemp, Warning, TEXT("UE start connect"));
Socket->Send(RegisterMsg);
}
void UWebSocketClient::OnConnectError(const FString& Error)
{
UE_LOG(LogTemp, Warning, TEXT("UE connect fail"));
}
void UWebSocketClient::OnClosed(int32 StatusCode, const FString& Reason, bool bWasClean)
{
// Optional log
}
void UWebSocketClient::OnMessage(const FString& Message)
{
// Event chỉ broadcast Message
UE_LOG(LogTemp, Warning, TEXT("UE RECEIVED (C++): %s"), *Message);
OnMessageEvent.Broadcast(Message);
}
void UWebSocketClient::SendMessageToServer(const FString& Message)
{
if (Socket.IsValid() && Socket->IsConnected())
{
Socket->Send(Message);
}
}
header
class IWebSocket;
// Event gửi tin nhắn về Blueprint (Không cần Sender)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(
FOnWebSocketMessage,
const FString&, Message
);
UCLASS(Blueprintable)
class MYPROJECT2_API UWebSocketClient : public UObject
{
GENERATED_BODY()
public:
/** NODE: Chỉ cần Role → Tự động connect */
UFUNCTION(BlueprintCallable, Category = "WebSocket",
meta = (DisplayName = "Create WebSocket Client", WorldContext = "WorldContextObject"))
static UWebSocketClient* CreateWebSocketClient(
UObject* WorldContextObject,
const FString& Role
);
/** Gửi message lên server */
UFUNCTION(BlueprintCallable, Category = "WebSocket")
void SendMessageToServer(const FString& Message);
public:
/** Role của client */
UPROPERTY(BlueprintReadOnly, Category = "WebSocket")
FString ClientRole;
/** Event returns Message ONLY */
UPROPERTY(BlueprintAssignable, Category = "WebSocket")
FOnWebSocketMessage OnMessageEvent;
protected:
virtual void BeginDestroy() override;
private:
void ConnectInternal();
void OnConnected();
void OnConnectError(const FString& Error);
void OnClosed(int32 StatusCode, const FString& Reason, bool bWasClean);
void OnMessage(const FString& Message);
private:
FString Url = TEXT("ws://127.0.0.1:7777");
TSharedPtr<IWebSocket> Socket;
};
my node
