Streamingle_URP/Assets/Scripts/KindRetargeting/Remote/RetargetingWebSocketServer.cs

108 lines
2.8 KiB
C#

using System;
using WebSocketSharp;
using WebSocketSharp.Server;
using UnityEngine;
namespace KindRetargeting.Remote
{
/// <summary>
/// WebSocket 서버 - 실시간 양방향 통신을 담당합니다.
/// </summary>
public class RetargetingWebSocketServer
{
private WebSocketServer wss;
private int port;
private bool isRunning = false;
public bool IsRunning => isRunning;
public int Port => port;
public event Action<string> OnMessageReceived;
public RetargetingWebSocketServer(int port)
{
this.port = port;
}
public void Start()
{
if (isRunning) return;
try
{
wss = new WebSocketServer(port);
wss.AddWebSocketService<RetargetingBehavior>("/retargeting", behavior =>
{
behavior.OnMessageReceivedCallback = (msg) => OnMessageReceived?.Invoke(msg);
});
wss.Start();
isRunning = true;
Debug.Log($"[RetargetingWS] WebSocket 서버 시작됨 (포트: {port})");
}
catch (Exception ex)
{
Debug.LogError($"[RetargetingWS] 서버 시작 실패: {ex.Message}");
}
}
public void Stop()
{
if (!isRunning) return;
try
{
wss?.Stop();
}
catch (Exception) { }
isRunning = false;
Debug.Log("[RetargetingWS] WebSocket 서버 중지됨");
}
public void Broadcast(string message)
{
if (!isRunning || wss == null) return;
try
{
wss.WebSocketServices["/retargeting"].Sessions.Broadcast(message);
}
catch (Exception ex)
{
Debug.LogError($"[RetargetingWS] 브로드캐스트 실패: {ex.Message}");
}
}
/// <summary>
/// WebSocket 동작 핸들러
/// </summary>
private class RetargetingBehavior : WebSocketBehavior
{
public Action<string> OnMessageReceivedCallback;
protected override void OnOpen()
{
// 연결 시 로그 제거 (문서 요청에 따름)
}
protected override void OnClose(CloseEventArgs e)
{
// 연결 종료 시 로그 제거
}
protected override void OnMessage(MessageEventArgs e)
{
// 로그 제거 (문서 요청에 따름)
OnMessageReceivedCallback?.Invoke(e.Data);
}
protected override void OnError(ErrorEventArgs e)
{
Debug.LogError($"[RetargetingWS] 오류: {e.Message}");
}
}
}
}