|
|
@ -26,11 +26,18 @@ namespace Core |
|
|
|
public async Task StartAsync() |
|
|
|
public async Task StartAsync() |
|
|
|
{ |
|
|
|
{ |
|
|
|
while (true) |
|
|
|
while (true) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
{ |
|
|
|
Socket clientSocket = await serverSocket.AcceptAsync(); |
|
|
|
Socket clientSocket = await serverSocket.AcceptAsync(); |
|
|
|
Console.WriteLine($"[{DateTime.Now}] Accept client: {clientSocket.RemoteEndPoint}"); |
|
|
|
Console.WriteLine($"[{DateTime.Now}] Accept client: {clientSocket.RemoteEndPoint}"); |
|
|
|
ThreadPool.QueueUserWorkItem(RunAsync, clientSocket); |
|
|
|
ThreadPool.QueueUserWorkItem(RunAsync, clientSocket); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
catch (Exception ex) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
Console.WriteLine(ex); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private async void RunAsync(object? sender) |
|
|
|
private async void RunAsync(object? sender) |
|
|
@ -45,6 +52,8 @@ namespace Core |
|
|
|
string nickname = ""; |
|
|
|
string nickname = ""; |
|
|
|
string roomName = ""; |
|
|
|
string roomName = ""; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try |
|
|
|
|
|
|
|
{ |
|
|
|
while (true) |
|
|
|
while (true) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// header buffer |
|
|
|
// header buffer |
|
|
@ -52,7 +61,7 @@ namespace Core |
|
|
|
if (n1 < 1) |
|
|
|
if (n1 < 1) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Console.WriteLine($"[{DateTime.Now}] Disconnect client - {clientSocket.RemoteEndPoint}"); |
|
|
|
Console.WriteLine($"[{DateTime.Now}] Disconnect client - {clientSocket.RemoteEndPoint}"); |
|
|
|
clientSocket.Dispose(); |
|
|
|
await Remove(id, nickname, roomName, clientSocket); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (n1 == 1) |
|
|
|
else if (n1 == 1) |
|
|
@ -183,5 +192,35 @@ namespace Core |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
catch (Exception ex) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
Console.WriteLine(ex); |
|
|
|
|
|
|
|
await Remove(id, nickname, roomName, clientSocket); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async Task Remove(string id, string nickname, string roomName, Socket clientSocket) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
Clients.TryRemove(id, out _); |
|
|
|
|
|
|
|
if (Rooms.TryGetValue(roomName, out var room)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
UserLeavePacket packet = new UserLeavePacket(nickname); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
room.Users.TryRemove(id, out _); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (room.Users.IsEmpty) |
|
|
|
|
|
|
|
Rooms.TryRemove(roomName, out _); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
roomName = ""; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var user in room.Users) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (Clients.TryGetValue(user.Key, out var otherClient)) |
|
|
|
|
|
|
|
await otherClient.SendAsync(packet.Serialize(), SocketFlags.None); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clientSocket.Dispose(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|