Implement desktop sync protocol handling

This commit is contained in:
Misaka
2026-05-15 21:19:27 +08:00
parent 498251ad79
commit 4c314c510b
9 changed files with 253 additions and 14 deletions

View File

@@ -8,8 +8,14 @@ namespace WirelessTextSyncer.Windows.Services;
public sealed class WebSocketServerService : IDisposable
{
private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web)
{
PropertyNameCaseInsensitive = true
};
private readonly SyncMessageHandler messageHandler;
private readonly List<IWebSocketConnection> clients = [];
private readonly object clientsLock = new();
private WebSocketServer? server;
public WebSocketServerService(SyncMessageHandler messageHandler)
@@ -21,7 +27,16 @@ public sealed class WebSocketServerService : IDisposable
public string LocalIpAddress { get; private set; } = "127.0.0.1";
public bool HasClient => clients.Count > 0;
public bool HasClient
{
get
{
lock (clientsLock)
{
return clients.Count > 0;
}
}
}
public event EventHandler? StatusChanged;
@@ -35,12 +50,20 @@ public sealed class WebSocketServerService : IDisposable
{
socket.OnOpen = () =>
{
clients.Add(socket);
lock (clientsLock)
{
clients.Add(socket);
}
StatusChanged?.Invoke(this, EventArgs.Empty);
};
socket.OnClose = () =>
{
clients.Remove(socket);
lock (clientsLock)
{
clients.Remove(socket);
}
StatusChanged?.Invoke(this, EventArgs.Empty);
};
socket.OnMessage = HandleRawMessage;
@@ -49,24 +72,37 @@ public sealed class WebSocketServerService : IDisposable
public void Dispose()
{
foreach (var client in clients.ToArray())
IWebSocketConnection[] currentClients;
lock (clientsLock)
{
currentClients = clients.ToArray();
clients.Clear();
}
foreach (var client in currentClients)
{
client.Close();
}
clients.Clear();
server?.Dispose();
}
private void HandleRawMessage(string rawMessage)
{
var message = JsonSerializer.Deserialize<SyncMessage>(rawMessage);
if (message is null)
try
{
var message = JsonSerializer.Deserialize<SyncMessage>(rawMessage, JsonOptions);
if (message is null)
{
return;
}
messageHandler.Handle(message);
}
catch (JsonException)
{
return;
}
messageHandler.Handle(message);
}
private static string ResolveLocalIpAddress()