|
|
|
@ -13,7 +13,8 @@ namespace Core |
|
|
|
|
{ |
|
|
|
|
private Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); |
|
|
|
|
|
|
|
|
|
private ConcurrentDictionary<string, Room> Rooms { get; } = new ConcurrentDictionary<string, Room>(); |
|
|
|
|
public ConcurrentDictionary<string, Room> Rooms { get; } = new ConcurrentDictionary<string, Room>(); |
|
|
|
|
public ConcurrentDictionary<string, Socket> Clients { get; } = new ConcurrentDictionary<string, Socket>(); |
|
|
|
|
|
|
|
|
|
public PServer(string ip, int port, int backlog) |
|
|
|
|
{ |
|
|
|
@ -74,6 +75,8 @@ namespace Core |
|
|
|
|
if (packetType == PacketType.LoginRequest) |
|
|
|
|
{ |
|
|
|
|
LoginRequestPacket requestPacket = new LoginRequestPacket(dataBuffer); |
|
|
|
|
|
|
|
|
|
Clients.TryAdd(requestPacket.Id, clientSocket); |
|
|
|
|
Console.WriteLine($"[{DateTime.Now}] LoginRequest - Id: {requestPacket.Id}, Nickname: {requestPacket.NickName}"); |
|
|
|
|
|
|
|
|
|
id = requestPacket.Id; |
|
|
|
@ -119,6 +122,24 @@ namespace Core |
|
|
|
|
|
|
|
|
|
EnterRoomResponsePacket responsePacket = new EnterRoomResponsePacket(StatusCode.Success); |
|
|
|
|
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None); |
|
|
|
|
|
|
|
|
|
await Task.Delay(100); |
|
|
|
|
foreach (var user in room.Users) |
|
|
|
|
{ |
|
|
|
|
if (user.Value == nickname) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
// add me to other user |
|
|
|
|
if (Clients.TryGetValue(user.Key, out var otherClient)) |
|
|
|
|
{ |
|
|
|
|
UserEnterPacket enterPacket = new UserEnterPacket(nickname); |
|
|
|
|
await otherClient.SendAsync(enterPacket.Serialize(), SocketFlags.None); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// add other user to me |
|
|
|
|
UserEnterPacket packet = new UserEnterPacket(user.Value); |
|
|
|
|
await clientSocket.SendAsync(packet.Serialize(), SocketFlags.None); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
@ -129,6 +150,25 @@ namespace Core |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else if (packetType == PacketType.UserLeave) |
|
|
|
|
{ |
|
|
|
|
UserLeavePacket packet = new UserLeavePacket(dataBuffer); |
|
|
|
|
if (Rooms.TryGetValue(roomName, out var room)) |
|
|
|
|
{ |
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|