KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
UWebSocketSystem.cpp
이 파일의 문서화 페이지로 가기
1// Copyright (c) 2025 Doppleddiggong. All rights reserved. Unauthorized copying, modification, or distribution of this file, via any medium is strictly prohibited. Proprietary and confidential.
2
8#include "UWebSocketSystem.h"
9#include "NetworkData.h"
10#include "WebSocketsModule.h"
11#include "NetworkLog.h"
12#include "Misc/Base64.h"
13
14// --- Subsystem Lifecycle ---
15
16void UWebSocketSystem::Initialize(FSubsystemCollectionBase& Collection)
17{
18 Super::Initialize(Collection);
19 bIsExpectingAudio = false;
20}
21
23{
24 if (WebSocket.IsValid())
25 {
26 // Unbind all delegates
27 WebSocket->OnConnected().RemoveAll(this);
28 WebSocket->OnConnectionError().RemoveAll(this);
29 WebSocket->OnClosed().RemoveAll(this);
30 WebSocket->OnMessage().RemoveAll(this);
31 WebSocket->OnBinaryMessage().RemoveAll(this);
32
33 if (WebSocket->IsConnected())
34 {
35 WebSocket->Close();
36 }
37 }
38 Super::Deinitialize();
39}
40
41// --- Client Actions ---
42
44{
45 if (IsConnected())
46 {
47 LogNetwork(TEXT("Already connected."));
48 return;
49 }
50
51 const FString Url = NetworkConfig::GetSocketURL();
52 if (Url.IsEmpty())
53 {
54 LogNetwork(TEXT("WebSocket URL is empty. Please check your configuration in DefaultMyNetwork.ini."));
55 return;
56 }
57
58 LogNetwork(FString::Printf(TEXT("Connecting to %s"), *Url));
59
60 FWebSocketsModule& WebSocketModule = FModuleManager::LoadModuleChecked<FWebSocketsModule>(TEXT("WebSockets"));
61 WebSocket = WebSocketModule.CreateWebSocket(Url, TEXT("ws"));
62
63 // Bind native delegates
64 WebSocket->OnConnected().AddUObject(this, &UWebSocketSystem::OnConnected_Native);
65 WebSocket->OnConnectionError().AddUObject(this, &UWebSocketSystem::OnConnectionError_Native);
66 WebSocket->OnClosed().AddUObject(this, &UWebSocketSystem::OnClosed_Native);
67 WebSocket->OnMessage().AddUObject(this, &UWebSocketSystem::OnMessage_Native);
68 WebSocket->OnBinaryMessage().AddUObject(this, &UWebSocketSystem::OnBinaryMessage_Native);
69
70 WebSocket->Connect();
71}
72
74{
75 if (WebSocket.IsValid() && WebSocket->IsConnected())
76 {
77 LogNetwork(TEXT("Disconnecting..."));
78 WebSocket->Close();
79 }
80}
81
83{
84 return WebSocket.IsValid() && WebSocket->IsConnected();
85}
86
88{
89 if (!IsConnected())
90 {
91 LogNetwork(TEXT("Cannot send ping. Not connected."));
92 return;
93 }
94
95 LogNetwork(TEXT("Sending Ping"));
96 WebSocket->Send(TEXT("{\"type\":\"ping\"}"));
97}
98
99// --- Native WebSocket Callbacks ---
100
102{
103 LogNetwork(TEXT("Connection successful."));
104 bIsExpectingAudio = false;
105 // OnConnected.Broadcast();
106}
107
108void UWebSocketSystem::OnConnectionError_Native(const FString& InErrorMessage)
109{
110 LogNetwork(FString::Printf(TEXT("Connection failed: %s"), *InErrorMessage));
111 // OnConnectionError.Broadcast(InErrorMessage);
112}
113
114void UWebSocketSystem::OnClosed_Native(int32 StatusCode, const FString& Reason, bool bWasClean)
115{
116 LogNetwork(FString::Printf(TEXT("Connection closed. Code: %d, Reason: %s, Clean: %s"), StatusCode, *Reason, bWasClean ? TEXT("true") : TEXT("false")));
117 bIsExpectingAudio = false;
118 // OnClosed.Broadcast(StatusCode, Reason, bWasClean);
119}
120
121void UWebSocketSystem::OnMessage_Native(const FString& InMessage)
122{
123 TSharedPtr<FJsonObject> JsonObject;
124 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(InMessage);
125
126 if (!FJsonSerializer::Deserialize(Reader, JsonObject) || !JsonObject.IsValid())
127 {
128 LogNetwork(FString::Printf(TEXT("Failed to parse incoming JSON message: %s"), *InMessage));
129 return;
130 }
131
132 FString MessageType;
133 if (!JsonObject->TryGetStringField(TEXT("type"), MessageType))
134 {
135 LogNetwork(FString::Printf(TEXT("Incoming JSON has no 'type' field: %s"), *InMessage));
136 return;
137 }
138
139 if (MessageType == TEXT("pong"))
140 {
141 LogNetwork(TEXT("Received Pong"));
142 }
143 else if (MessageType == TEXT("error"))
144 {
145 LogNetwork(FString::Printf(TEXT("Received message: %s"), *InMessage));
146
147 FString ErrorMessage;
148 if (JsonObject->TryGetStringField(TEXT("message"), ErrorMessage))
149 {
150 LogNetwork(FString::Printf(TEXT("Server Error: %s"), *ErrorMessage));
151 // OnSocketError.Broadcast(ErrorMessage);
152 }
153 else
154 {
155 LogNetwork(TEXT("Server Error: (no message field)"));
156 // OnSocketError.Broadcast(TEXT("Unknown server error"));
157 }
158 }
159 else
160 {
161 LogNetwork(FString::Printf(TEXT("Unknown message type received: %s"), *MessageType));
162 }
163}
164
165void UWebSocketSystem::OnBinaryMessage_Native(const void* Data, SIZE_T Size, bool bIsLastFragment)
166{
167 LogNetwork(FString::Printf(TEXT("Received binary message (%d bytes) - Currently not supported"), Size));
168 // 바이너리 메시지는 현재 사용하지 않음 (모든 오디오는 JSON의 Base64로 전송됨)
169}
170
171// --- Logging ---
172
173void UWebSocketSystem::LogNetwork(const FString& Message)
174{
175 NETWORK_LOG(TEXT("[WS] %s"), *Message);
176}
#define NETWORK_LOG(fmt,...)
네트워크 요청과 응답에 사용되는 구조체 및 설정을 정의합니다.
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
실시간 음성·텍스트 상호작용을 위한 WebSocket 서브시스템을 선언합니다.
void OnBinaryMessage_Native(const void *Data, SIZE_T Size, bool bIsLastFragment)
바이너리 메시지를 수신했을 때 호출됩니다.
void OnMessage_Native(const FString &InMessage)
텍스트 메시지를 수신했을 때 호출됩니다.
void Disconnect()
활성화된 WebSocket 연결을 종료합니다.
TSharedPtr< IWebSocket > WebSocket
활성 WebSocket 인스턴스입니다.
void OnConnectionError_Native(const FString &InErrorMessage)
연결 오류 발생 시 호출되는 콜백입니다.
void OnClosed_Native(int32 StatusCode, const FString &Reason, bool bWasClean)
연결 종료 이벤트를 처리합니다.
void OnConnected_Native()
WebSocket 연결 완료 콜백입니다.
static void LogNetwork(const FString &Message)
WebSocket 관련 공통 로그 메시지를 출력합니다.
bool IsConnected() const
현재 WebSocket 연결 상태를 조회합니다.
virtual void Initialize(FSubsystemCollectionBase &Collection) override
void SendPing()
연결 상태 유지를 위해 Ping 메시지를 전송합니다.
virtual void Deinitialize() override
void Connect()
WebSocket 서버와 연결을 수립합니다.
bool bIsExpectingAudio
서버에서 오디오 스트림 시작을 예상하는지 여부입니다.
static FString GetSocketURL()
현재 서버 모드에서 사용할 WebSocket 주소를 반환합니다.
Definition NetworkData.h:68