create room, get room information from server

This commit is contained in:
2023-02-10 17:55:09 +09:00
parent 3230581fb5
commit 09cce59aa2
12 changed files with 393 additions and 18 deletions

View File

@@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Core
{
public class CreateRoomRequestPacket : IPacket
{
public string RoomName { get; private set; }
public CreateRoomRequestPacket(string roomName)
{
RoomName = roomName;
}
public CreateRoomRequestPacket(byte[] buffer)
{
int cursor = 2;
short roomNameSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, cursor));
cursor += sizeof(short);
RoomName = Encoding.UTF8.GetString(buffer, cursor, roomNameSize);
}
public byte[] Serialize()
{
// 2bytes header
// data: 2bytes packetType + 2bytes id size + id + 2bytes nickname size + nickname
byte[] packetType = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)PacketType.CreateRoomRequest));
byte[] roomName = Encoding.UTF8.GetBytes(RoomName);
byte[] roomNameSize = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)roomName.Length));
short dataSize = (short)(packetType.Length + roomName.Length + roomNameSize.Length);
byte[] header = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(dataSize));
byte[] buffer = new byte[2 + dataSize];
int cursor = 0;
Array.Copy(header, 0, buffer, cursor, header.Length);
cursor += header.Length;
Array.Copy(packetType, 0, buffer, cursor, packetType.Length);
cursor += packetType.Length;
Array.Copy(roomNameSize, 0, buffer, cursor, roomNameSize.Length);
cursor += roomNameSize.Length;
Array.Copy(roomName, 0, buffer, cursor, roomName.Length);
return buffer;
}
}
}

View File

@@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Core
{
public class CreateRoomResponsePacket : IPacket
{
public StatusCode Code { get; set; }
public CreateRoomResponsePacket(StatusCode code)
{
Code = code;
}
public CreateRoomResponsePacket(byte[] buffer)
{
Code = (StatusCode)IPAddress.NetworkToHostOrder(BitConverter.ToInt32(buffer, 2));
}
public byte[] Serialize()
{
// 2bytes header
// data: 2bytes packetType + code
byte[] packetType = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)PacketType.CreateRoomResponse));
byte[] code = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((int)Code));
short dataSize = (short)(packetType.Length + code.Length);
byte[] header = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(dataSize));
byte[] buffer = new byte[2 + dataSize];
int cursor = 0;
Array.Copy(header, 0, buffer, cursor, header.Length);
cursor += header.Length;
Array.Copy(packetType, 0, buffer, cursor, packetType.Length);
cursor += packetType.Length;
Array.Copy(code, 0, buffer, cursor, code.Length);
return buffer;
}
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Net;
@@ -11,7 +12,9 @@ namespace Core
public class PServer
{
private Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private ConcurrentDictionary<string, Room> Rooms { get; } = new ConcurrentDictionary<string, Room>();
public PServer(string ip, int port, int backlog)
{
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), port);
@@ -37,13 +40,17 @@ namespace Core
Socket clientSocket = (Socket)sender;
byte[] headerBuffer = new byte[2];
string id = "";
string nickname = "";
string roomName = "";
while (true)
{
// header buffer
int n1 = await clientSocket.ReceiveAsync(headerBuffer, SocketFlags.None);
if (n1 < 1)
{
Console.WriteLine($"[{DateTime.Now}] Disconnect client: {clientSocket.RemoteEndPoint}");
Console.WriteLine($"[{DateTime.Now}] Disconnect client - {clientSocket.RemoteEndPoint}");
clientSocket.Dispose();
return;
}
@@ -67,11 +74,40 @@ namespace Core
if (packetType == PacketType.LoginRequest)
{
LoginRequestPacket requestPacket = new LoginRequestPacket(dataBuffer);
Console.WriteLine($"Id: {requestPacket.Id}, Nickname: {requestPacket.NickName}");
Console.WriteLine($"[{DateTime.Now}] LoginRequest - Id: {requestPacket.Id}, Nickname: {requestPacket.NickName}");
id = requestPacket.Id;
nickname = requestPacket.NickName;
LoginResponsePacket responsePacket = new LoginResponsePacket(StatusCode.Success);
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None);
}
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}");
CreateRoomResponsePacket responsePacket = new CreateRoomResponsePacket(StatusCode.Success);
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)
{
RoomListResponsePacket packet = new RoomListResponsePacket(Rooms.Keys);
await clientSocket.SendAsync(packet.Serialize(), SocketFlags.None);
}
}
}
}

View File

@@ -10,5 +10,9 @@ namespace Core
{
LoginRequest,
LoginResponse,
CreateRoomRequest,
CreateRoomResponse,
RoomListRequest,
RoomListResponse,
}
}

14
Chat/Core/Room.cs Normal file
View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Core
{
public class Room
{
public ConcurrentDictionary<string, string> Users { get; } = new ConcurrentDictionary<string, string>();
}
}

View File

@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Core
{
public class RoomListRequestPacket : IPacket
{
public byte[] Serialize()
{
byte[] packetType = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)PacketType.RoomListRequest));
short dataSize = (short)(packetType.Length);
byte[] header = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(dataSize));
byte[] buffer = new byte[2 + dataSize];
int cursor = 0;
Array.Copy(header, 0, buffer, cursor, header.Length);
cursor += header.Length;
Array.Copy(packetType, 0, buffer, cursor, packetType.Length);
return buffer;
}
}
}

View File

@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Core
{
public class RoomListResponsePacket : IPacket
{
public List<string> RoomNames { get; }
public RoomListResponsePacket(ICollection<string> roomNames)
{
RoomNames = new List<string>(roomNames);
}
public RoomListResponsePacket(byte[] buffer)
{
RoomNames = new List<string>();
for (int cursor = 2; cursor < buffer.Length;)
{
short roomNameSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, cursor));
cursor += sizeof(short);
RoomNames.Add(Encoding.UTF8.GetString(buffer, cursor, roomNameSize));
cursor += roomNameSize;
}
}
public byte[] Serialize()
{
byte[] packetType = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)PacketType.RoomListResponse));
short dataSize = (short)(packetType.Length);
List<byte[]> temp = new List<byte[]>();
foreach (string item in RoomNames)
{
byte[] nameBuffer = Encoding.UTF8.GetBytes(item);
byte[] nameSize = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)nameBuffer.Length));
dataSize += (short)(nameBuffer.Length + nameSize.Length);
temp.Add(nameSize);
temp.Add(nameBuffer);
}
byte[] header = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(dataSize));
byte[] buffer = new byte[2 + dataSize];
int cursor = 0;
Array.Copy(header, 0, buffer, cursor, header.Length);
cursor += header.Length;
Array.Copy(packetType, 0, buffer, cursor, packetType.Length);
cursor += packetType.Length;
foreach (byte[] item in temp)
{
Array.Copy(item, 0, buffer, cursor, item.Length);
cursor += item.Length;
}
return buffer;
}
}
}

View File

@@ -9,5 +9,6 @@ namespace Core
public enum StatusCode
{
Success = 200,
Failed = 500,
}
}