WebGL 샘플

This commit is contained in:
logonkhi
2025-11-11 12:13:15 +09:00
parent 12c0b8c429
commit ef0c7546dc
15 changed files with 53971 additions and 125 deletions

View File

@@ -246,22 +246,26 @@ namespace UVC.Network
headerObject.Add(kvp.Key, kvp.Value);
}
}
HttpLogEntry log = ServerLog.LogHttpRequest(url, methodString, headerObject.ToString(Formatting.None), body, DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"));
//Debug.Log($"Request APIToken :{AuthService.Instance.Entiti.accessToken}");
if (body != null)
{
request.UploadSettings.UploadStream = new MemoryStream(Encoding.UTF8.GetBytes(body));
}
#if !UNITY_WEBGL || UNITY_EDITOR
HttpLogEntry log = ServerLog.LogHttpRequest(url, methodString, headerObject.ToString(Formatting.None), body, DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"));
//Debug.Log($"Request APIToken :{AuthService.Instance.Entiti.accessToken}");
bool isMainThread = PlayerLoopHelper.IsMainThread;
#endif
//var response = await request.GetFromJsonResultAsync<T>();
var response = await request.GetAsStringAsync();
#if !UNITY_WEBGL || UNITY_EDITOR
if (!isMainThread) await UniTask.SwitchToThreadPool();
log.ResponseData = response;
log.ResponseDate = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
#endif
ServerLog.LogHttpResponse(log);
#endif
//T가 string이면
if (typeof(T) == typeof(string))
{

View File

@@ -37,12 +37,17 @@ namespace UVC.network
/// <value>클라이언트가 초기화되고 브로커에 연결된 경우 <c>true</c>를 반환합니다.</value>
public bool IsConnected => client != null && client.State == ClientStates.Connected;
private bool useTLS = false;
private bool useWebSocket = false;
/// <summary>
/// MQTTService 인스턴스를 생성합니다.
/// </summary>
/// <param name="domain">MQTT 브로커의 호스트명 또는 IP 주소입니다.</param>
/// <param name="port">MQTT 브로커의 포트 번호입니다.</param>
/// <param name="useWebSocket">WebSocket을 통해 연결할지 여부입니다.</param>
/// <param name="useTLS">TLS 암호화를 사용할지 여부입니다.</param>
/// <param name="autoReconnect">연결이 끊겼을 때 자동으로 재연결을 시도할지 여부입니다.</param>
/// <param name="onBackground">Handler를 백그라운드 스레드에서 호출 할지 여부</param>
/// <example>
@@ -54,12 +59,14 @@ namespace UVC.network
/// var mqttService = new MQTTService("mqtt.example.com", 8883, false);
/// </code>
/// </example>
public MQTTService(string domain, int port = 1883, bool autoReconnect = true, bool onBackground = true)
public MQTTService(string domain, int port = 1883, bool useWebSocket = false, bool useTLS = false, bool autoReconnect = true, bool onBackground = true)
{
topicHandler = new ConcurrentDictionary<string, Action<string, string>>();
MQTTDomain = domain;
MQTTPort = port;
this.autoReconnect = autoReconnect;
this.useTLS = useTLS;
this.useWebSocket = useWebSocket;
}
/// <summary>
@@ -71,15 +78,20 @@ namespace UVC.network
private void CreateMQTTClient()
{
ULog.Debug($"MQTT Domain:{MQTTDomain} , MQTTPORT:{MQTTPort}");
var options = new ConnectionOptionsBuilder()
#if UNITY_WEBGL && !UNITY_EDITOR
.WithWebSocket(MQTTDomain, MQTTPort)
.WithPath("/mqtt") // 필요 시 "/ws" 등 브로커/프록시 설정과 일치하게 변경
// .WithTLS() // wss://가 필요하면 활성화
#else
.WithTCP(MQTTDomain, MQTTPort)
var builder = new ConnectionOptionsBuilder();
if (useWebSocket) {
builder.WithWebSocket(MQTTDomain, MQTTPort)
.WithPath("/mqtt"); // 필요 시 "/ws" 등 브로커/프록시 설정과 일치하게 변경
}
else {
#if !UNITY_WEBGL || UNITY_EDITOR
builder.WithTCP(MQTTDomain, MQTTPort);
#endif
.Build();
}
if(useTLS) builder.WithTLS();
var options = builder.Build();
if (client != null) Disconnect();
@@ -334,23 +346,25 @@ namespace UVC.network
// 웹GL 대응: 스레드풀 미지원 시 메인 스레드로 포스트
private void DispatchTopic(Action work)
{
#if UNITY_WEBGL && !UNITY_EDITOR
// WebGL: 스레드풀 없음 → 다음 프레임에 메인 스레드로 실행
UniTask.Post(work);
#else
if (onBackgroundThread)
if (useWebSocket)
{
UniTask.RunOnThreadPool(work).Forget();
// WebGL: 스레드풀 없음 → 다음 프레임에 메인 스레드로 실행
UniTask.Post(work);
}
else
{
if (PlayerLoopHelper.IsMainThread)
work();
if (onBackgroundThread)
{
UniTask.RunOnThreadPool(work).Forget();
}
else
UniTask.Post(work);
{
if (PlayerLoopHelper.IsMainThread)
work();
else
UniTask.Post(work);
}
}
#endif
}
@@ -359,7 +373,9 @@ namespace UVC.network
//Debug.Log($"MQTT OnTopicLogic isMainThread={PlayerLoopHelper.IsMainThread}");
string payload = Encoding.UTF8.GetString(message.Payload.Data, message.Payload.Offset, message.Payload.Count);
//ULog.Debug($"MQTT OnTopic {topic.Filter.OriginalFilter} => {payload}");
#if !UNITY_WEBGL || UNITY_EDITOR
ServerLog.LogMqtt(MQTTDomain, MQTTPort.ToString(), topic.Filter.OriginalFilter, payload, DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"));
#endif
if(payload.Trim().Length > 0)
{
if (topicHandler.TryGetValue(topic.Filter.OriginalFilter, out var handler))