main
syneffort 2 years ago
parent a8be3eb3a4
commit 7a8c240d70
  1. 121
      Chat/Client/Singleton.cs
  2. 251
      Chat/Core/PServer.cs

@ -44,69 +44,78 @@ namespace Client
Socket socket = (Socket)sender; Socket socket = (Socket)sender;
byte[] headerBuffer = new byte[2]; byte[] headerBuffer = new byte[2];
while (true)
try
{ {
// header buffer while (true)
int n1 = await socket.ReceiveAsync(headerBuffer, SocketFlags.None);
if (n1 < 1)
{
Console.WriteLine($"[{DateTime.Now}] Disconnect server: {socket.RemoteEndPoint}");
socket.Dispose();
return;
}
else if (n1 == 1)
{ {
await socket.ReceiveAsync(new ArraySegment<byte>(headerBuffer, 1, 1), SocketFlags.None); // header buffer
} int n1 = await socket.ReceiveAsync(headerBuffer, SocketFlags.None);
if (n1 < 1)
{
Console.WriteLine($"[{DateTime.Now}] Disconnect server: {socket.RemoteEndPoint}");
socket.Dispose();
return;
}
else if (n1 == 1)
{
await socket.ReceiveAsync(new ArraySegment<byte>(headerBuffer, 1, 1), SocketFlags.None);
}
// data buffer // data buffer
short dataSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(headerBuffer)); short dataSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(headerBuffer));
byte[] dataBuffer = new byte[dataSize]; byte[] dataBuffer = new byte[dataSize];
int totalRecv = 0; int totalRecv = 0;
while (totalRecv < dataSize) while (totalRecv < dataSize)
{ {
int n2 = await socket.ReceiveAsync(new ArraySegment<byte>(dataBuffer, totalRecv, dataSize - totalRecv), SocketFlags.None); int n2 = await socket.ReceiveAsync(new ArraySegment<byte>(dataBuffer, totalRecv, dataSize - totalRecv), SocketFlags.None);
totalRecv += n2; totalRecv += n2;
} }
PacketType packetType = (PacketType)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(dataBuffer)); PacketType packetType = (PacketType)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(dataBuffer));
if (packetType == PacketType.LoginResponse) if (packetType == PacketType.LoginResponse)
{ {
LoginResponsePacket packet = new LoginResponsePacket(dataBuffer); LoginResponsePacket packet = new LoginResponsePacket(dataBuffer);
LoginResponsed?.Invoke(packet, EventArgs.Empty); LoginResponsed?.Invoke(packet, EventArgs.Empty);
} }
else if (packetType == PacketType.CreateRoomResponse) else if (packetType == PacketType.CreateRoomResponse)
{ {
CreateRoomResponsePacket packet = new CreateRoomResponsePacket(dataBuffer); CreateRoomResponsePacket packet = new CreateRoomResponsePacket(dataBuffer);
CreateRoomResponsed?.Invoke(packet, EventArgs.Empty); CreateRoomResponsed?.Invoke(packet, EventArgs.Empty);
} }
else if (packetType == PacketType.RoomListResponse) else if (packetType == PacketType.RoomListResponse)
{ {
RoomListResponsePacket packet = new RoomListResponsePacket(dataBuffer); RoomListResponsePacket packet = new RoomListResponsePacket(dataBuffer);
RoomListResponsed?.Invoke(packet, EventArgs.Empty); RoomListResponsed?.Invoke(packet, EventArgs.Empty);
} }
else if (packetType == PacketType.EnterRoomResponse) else if (packetType == PacketType.EnterRoomResponse)
{ {
EnterRoomResponsePacket packet = new EnterRoomResponsePacket(dataBuffer); EnterRoomResponsePacket packet = new EnterRoomResponsePacket(dataBuffer);
EnterRoomResponsed?.Invoke(packet, EventArgs.Empty); EnterRoomResponsed?.Invoke(packet, EventArgs.Empty);
} }
else if (packetType == PacketType.UserEnter) else if (packetType == PacketType.UserEnter)
{ {
UserEnterPacket packet = new UserEnterPacket(dataBuffer); UserEnterPacket packet = new UserEnterPacket(dataBuffer);
UserEnterResponsed?.Invoke(packet, EventArgs.Empty); UserEnterResponsed?.Invoke(packet, EventArgs.Empty);
} }
else if (packetType == PacketType.UserLeave) else if (packetType == PacketType.UserLeave)
{ {
UserLeavePacket packet = new UserLeavePacket(dataBuffer); UserLeavePacket packet = new UserLeavePacket(dataBuffer);
UserLeaveResponsed?.Invoke(packet, EventArgs.Empty); UserLeaveResponsed?.Invoke(packet, EventArgs.Empty);
} }
else if (packetType == PacketType.Chat) else if (packetType == PacketType.Chat)
{ {
ChatPacket packet = new ChatPacket(dataBuffer); ChatPacket packet = new ChatPacket(dataBuffer);
ChatResponsed?.Invoke(packet, EventArgs.Empty); ChatResponsed?.Invoke(packet, EventArgs.Empty);
}
} }
} }
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
Environment.Exit(1);
}
} }
} }
} }

@ -27,9 +27,16 @@ namespace Core
{ {
while (true) while (true)
{ {
Socket clientSocket = await serverSocket.AcceptAsync(); try
Console.WriteLine($"[{DateTime.Now}] Accept client: {clientSocket.RemoteEndPoint}"); {
ThreadPool.QueueUserWorkItem(RunAsync, clientSocket); Socket clientSocket = await serverSocket.AcceptAsync();
Console.WriteLine($"[{DateTime.Now}] Accept client: {clientSocket.RemoteEndPoint}");
ThreadPool.QueueUserWorkItem(RunAsync, clientSocket);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
} }
} }
@ -45,143 +52,175 @@ namespace Core
string nickname = ""; string nickname = "";
string roomName = ""; string roomName = "";
while (true) try
{ {
// header buffer while (true)
int n1 = await clientSocket.ReceiveAsync(headerBuffer, SocketFlags.None);
if (n1 < 1)
{ {
Console.WriteLine($"[{DateTime.Now}] Disconnect client - {clientSocket.RemoteEndPoint}"); // header buffer
clientSocket.Dispose(); int n1 = await clientSocket.ReceiveAsync(headerBuffer, SocketFlags.None);
return; if (n1 < 1)
} {
else if (n1 == 1) Console.WriteLine($"[{DateTime.Now}] Disconnect client - {clientSocket.RemoteEndPoint}");
{ await Remove(id, nickname, roomName, clientSocket);
await clientSocket.ReceiveAsync(new ArraySegment<byte>(headerBuffer, 1, 1), SocketFlags.None); return;
} }
else if (n1 == 1)
{
await clientSocket.ReceiveAsync(new ArraySegment<byte>(headerBuffer, 1, 1), SocketFlags.None);
}
// data buffer // data buffer
short dataSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(headerBuffer)); short dataSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(headerBuffer));
byte[] dataBuffer = new byte[dataSize]; byte[] dataBuffer = new byte[dataSize];
int totalRecv = 0; int totalRecv = 0;
while (totalRecv < dataSize) while (totalRecv < dataSize)
{ {
int n2 = await clientSocket.ReceiveAsync(new ArraySegment<byte>(dataBuffer, totalRecv, dataSize - totalRecv), SocketFlags.None); int n2 = await clientSocket.ReceiveAsync(new ArraySegment<byte>(dataBuffer, totalRecv, dataSize - totalRecv), SocketFlags.None);
totalRecv += n2; totalRecv += n2;
} }
PacketType packetType = (PacketType)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(dataBuffer)); PacketType packetType = (PacketType)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(dataBuffer));
if (packetType == PacketType.LoginRequest) if (packetType == PacketType.LoginRequest)
{ {
LoginRequestPacket requestPacket = new LoginRequestPacket(dataBuffer); LoginRequestPacket requestPacket = new LoginRequestPacket(dataBuffer);
bool result = Clients.TryAdd(requestPacket.Id, clientSocket);
Console.WriteLine($"[{DateTime.Now}] LoginRequest - Id: {requestPacket.Id}, Nickname: {requestPacket.NickName}");
id = requestPacket.Id; bool result = Clients.TryAdd(requestPacket.Id, clientSocket);
nickname = requestPacket.NickName; Console.WriteLine($"[{DateTime.Now}] LoginRequest - Id: {requestPacket.Id}, Nickname: {requestPacket.NickName}");
LoginResponsePacket responsePacket = new LoginResponsePacket(result ? StatusCode.Success : StatusCode.Failed); id = requestPacket.Id;
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None); nickname = requestPacket.NickName;
}
else if (packetType == PacketType.CreateRoomRequest)
{
CreateRoomRequestPacket requestPacket = new CreateRoomRequestPacket(dataBuffer);
Room room = new Room();
if (Rooms.TryAdd(requestPacket.RoomName, room))
{
roomName = requestPacket.RoomName;
room.Users.TryAdd(id, nickname);
Console.WriteLine($"[{DateTime.Now}] CreateRoomRequest - RoomName: {roomName}, id: {id}, nickname: {nickname}");
CreateRoomResponsePacket responsePacket = new CreateRoomResponsePacket(StatusCode.Success); LoginResponsePacket responsePacket = new LoginResponsePacket(result ? StatusCode.Success : StatusCode.Failed);
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None); await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None);
} }
else else if (packetType == PacketType.CreateRoomRequest)
{ {
Console.WriteLine($"[{DateTime.Now}] CreateRoomRequest failed - RoomName: {requestPacket.RoomName}"); CreateRoomRequestPacket requestPacket = new CreateRoomRequestPacket(dataBuffer);
Room room = new Room();
if (Rooms.TryAdd(requestPacket.RoomName, room))
{
roomName = requestPacket.RoomName;
room.Users.TryAdd(id, nickname);
Console.WriteLine($"[{DateTime.Now}] CreateRoomRequest - RoomName: {roomName}, id: {id}, nickname: {nickname}");
CreateRoomResponsePacket responsePacket = new CreateRoomResponsePacket(StatusCode.Failed); CreateRoomResponsePacket responsePacket = new CreateRoomResponsePacket(StatusCode.Success);
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None); await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None);
}
else
{
Console.WriteLine($"[{DateTime.Now}] CreateRoomRequest failed - RoomName: {requestPacket.RoomName}");
CreateRoomResponsePacket responsePacket = new CreateRoomResponsePacket(StatusCode.Failed);
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None);
}
} }
} else if (packetType == PacketType.RoomListRequest)
else if (packetType == PacketType.RoomListRequest)
{
RoomListResponsePacket packet = new RoomListResponsePacket(Rooms.Keys);
await clientSocket.SendAsync(packet.Serialize(), SocketFlags.None);
}
else if (packetType == PacketType.EnterRoomRequest)
{
EnterRoomRequestPacket requestPacket = new EnterRoomRequestPacket(dataBuffer);
if (Rooms.TryGetValue(requestPacket.RoomName, out var room))
{ {
roomName = requestPacket.RoomName; RoomListResponsePacket packet = new RoomListResponsePacket(Rooms.Keys);
room.Users.TryAdd(id, nickname); await clientSocket.SendAsync(packet.Serialize(), SocketFlags.None);
Console.WriteLine($"[{DateTime.Now}] EnterRoomRequest - RoomName: {roomName}, id: {id}, nickname: {nickname}"); }
else if (packetType == PacketType.EnterRoomRequest)
EnterRoomResponsePacket responsePacket = new EnterRoomResponsePacket(StatusCode.Success); {
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None); EnterRoomRequestPacket requestPacket = new EnterRoomRequestPacket(dataBuffer);
if (Rooms.TryGetValue(requestPacket.RoomName, out var room))
await Task.Delay(100);
foreach (var user in room.Users)
{ {
if (user.Value == nickname) roomName = requestPacket.RoomName;
continue; room.Users.TryAdd(id, nickname);
Console.WriteLine($"[{DateTime.Now}] EnterRoomRequest - RoomName: {roomName}, id: {id}, nickname: {nickname}");
EnterRoomResponsePacket responsePacket = new EnterRoomResponsePacket(StatusCode.Success);
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None);
// add me to other user await Task.Delay(100);
if (Clients.TryGetValue(user.Key, out var otherClient)) foreach (var user in room.Users)
{ {
UserEnterPacket enterPacket = new UserEnterPacket(nickname); if (user.Value == nickname)
await otherClient.SendAsync(enterPacket.Serialize(), SocketFlags.None); 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);
} }
// add other user to me
UserEnterPacket packet = new UserEnterPacket(user.Value);
await clientSocket.SendAsync(packet.Serialize(), SocketFlags.None);
} }
} else
else {
{ Console.WriteLine($"[{DateTime.Now}] EnterRoomRequest failed - RoomName: {requestPacket.RoomName}");
Console.WriteLine($"[{DateTime.Now}] EnterRoomRequest failed - RoomName: {requestPacket.RoomName}");
EnterRoomResponsePacket responsePacket = new EnterRoomResponsePacket(StatusCode.Failed); EnterRoomResponsePacket responsePacket = new EnterRoomResponsePacket(StatusCode.Failed);
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None); await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None);
}
} }
} else if (packetType == PacketType.UserLeave)
else if (packetType == PacketType.UserLeave)
{
UserLeavePacket packet = new UserLeavePacket(dataBuffer);
if (Rooms.TryGetValue(roomName, out var room))
{ {
room.Users.TryRemove(id, out _); UserLeavePacket packet = new UserLeavePacket(dataBuffer);
if (Rooms.TryGetValue(roomName, out var room))
{
room.Users.TryRemove(id, out _);
if (room.Users.IsEmpty) if (room.Users.IsEmpty)
Rooms.TryRemove(roomName, out _); Rooms.TryRemove(roomName, out _);
roomName = ""; roomName = "";
foreach (var user in room.Users) foreach (var user in room.Users)
{ {
if (Clients.TryGetValue(user.Key, out var otherClient)) if (Clients.TryGetValue(user.Key, out var otherClient))
await otherClient.SendAsync(packet.Serialize(), SocketFlags.None); await otherClient.SendAsync(packet.Serialize(), SocketFlags.None);
}
} }
} }
} else if (packetType == PacketType.Chat)
else if (packetType == PacketType.Chat)
{
ChatPacket packet = new ChatPacket(dataBuffer);
if (Rooms.TryGetValue(roomName, out var room))
{ {
foreach (var user in room.Users) ChatPacket packet = new ChatPacket(dataBuffer);
if (Rooms.TryGetValue(roomName, out var room))
{ {
if (Clients.TryGetValue(user.Key, out var otherClient)) foreach (var user in room.Users)
await otherClient.SendAsync(packet.Serialize(), SocketFlags.None); {
if (Clients.TryGetValue(user.Key, out var otherClient))
await otherClient.SendAsync(packet.Serialize(), SocketFlags.None);
}
} }
} }
} }
} }
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();
} }
} }
} }

Loading…
Cancel
Save