main
syneffort 2 years ago
parent 09cce59aa2
commit c4451759f7
  1. 40
      Chat/Client/RoomListForm.cs
  2. 6
      Chat/Client/Singleton.cs
  3. 58
      Chat/Core/EnterRoomRequestPacket.cs
  4. 49
      Chat/Core/EnterRoomResponsePacket.cs
  5. 23
      Chat/Core/PServer.cs
  6. 4
      Chat/Core/PacketType.cs

@ -25,10 +25,11 @@ namespace Client
private void InitInstance() private void InitInstance()
{ {
Singleton.Instance.CreateRoomResponsed += CreateRoomResponsed; Singleton.Instance.CreateRoomResponsed += CreateRoomResponsed;
Singleton.Instance.RoomListResponsed += Instance_RoomListResponsed; Singleton.Instance.RoomListResponsed += RoomListResponsed;
Singleton.Instance.EnterRoomResponsed += EnterRoomResponsed;
} }
private void btnEnter_Click(object sender, EventArgs e) private async void btnEnter_Click(object sender, EventArgs e)
{ {
if (lbxRoom.SelectedItem == null) if (lbxRoom.SelectedItem == null)
{ {
@ -36,14 +37,8 @@ namespace Client
return; return;
} }
IAsyncResult ar = null; EnterRoomRequestPacket packet = new EnterRoomRequestPacket(lbxRoom.SelectedItem.ToString());
ar = BeginInvoke(() => await Singleton.Instance.SendAsync(packet.Serialize(), SocketFlags.None);
{
ChatRoomForm chatRoomForm = new ChatRoomForm();
chatRoomForm.Text = lbxRoom.SelectedItem.ToString();
chatRoomForm.ShowDialog();
EndInvoke(ar);
});
} }
private async void btnCreate_Click(object sender, EventArgs e) private async void btnCreate_Click(object sender, EventArgs e)
@ -105,7 +100,7 @@ namespace Client
} }
} }
private void Instance_RoomListResponsed(object? sender, EventArgs e) private void RoomListResponsed(object? sender, EventArgs e)
{ {
if (sender == null) if (sender == null)
return; return;
@ -120,6 +115,25 @@ namespace Client
}); });
} }
private void EnterRoomResponsed(object? sender, EventArgs e)
{
if (sender == null)
return;
EnterRoomResponsePacket packet = (EnterRoomResponsePacket)sender;
InvokeMethod(() =>
{
IAsyncResult ar = null;
ar = BeginInvoke(() =>
{
ChatRoomForm chatRoomForm = new ChatRoomForm();
chatRoomForm.Text = lbxRoom.SelectedItem.ToString();
chatRoomForm.ShowDialog();
EndInvoke(ar);
});
});
}
private async void btnRefresh_Click(object sender, EventArgs e) private async void btnRefresh_Click(object sender, EventArgs e)
{ {
lbxRoom.Items.Clear(); lbxRoom.Items.Clear();
@ -130,7 +144,9 @@ namespace Client
private void RoomListForm_FormClosing(object sender, FormClosingEventArgs e) private void RoomListForm_FormClosing(object sender, FormClosingEventArgs e)
{ {
Singleton.Instance.CreateRoomResponsed -= CreateRoomResponsed; Singleton.Instance.CreateRoomResponsed -= CreateRoomResponsed;
Singleton.Instance.RoomListResponsed -= Instance_RoomListResponsed; Singleton.Instance.RoomListResponsed -= RoomListResponsed;
Singleton.Instance.EnterRoomResponsed -= EnterRoomResponsed;
Singleton.Instance.Socket.Shutdown(SocketShutdown.Send); Singleton.Instance.Socket.Shutdown(SocketShutdown.Send);
} }
} }

@ -20,6 +20,7 @@ namespace Client
public event EventHandler? LoginResponsed; public event EventHandler? LoginResponsed;
public event EventHandler? CreateRoomResponsed; public event EventHandler? CreateRoomResponsed;
public event EventHandler? RoomListResponsed; public event EventHandler? RoomListResponsed;
public event EventHandler? EnterRoomResponsed;
public async Task ConnectAsync(string ip, int port) public async Task ConnectAsync(string ip, int port)
{ {
@ -82,6 +83,11 @@ namespace Client
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)
{
EnterRoomResponsePacket packet = new EnterRoomResponsePacket(dataBuffer);
EnterRoomResponsed?.Invoke(packet, EventArgs.Empty);
}
} }
} }
} }

@ -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 EnterRoomRequestPacket : IPacket
{
public string RoomName { get; private set; }
public EnterRoomRequestPacket(string roomName)
{
RoomName = roomName;
}
public EnterRoomRequestPacket(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.EnterRoomRequest));
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;
}
}
}

@ -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 EnterRoomResponsePacket : IPacket
{
public StatusCode Code { get; set; }
public EnterRoomResponsePacket(StatusCode code)
{
Code = code;
}
public EnterRoomResponsePacket(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.EnterRoomResponse));
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;
}
}
}

@ -90,7 +90,7 @@ namespace Core
{ {
roomName = requestPacket.RoomName; roomName = requestPacket.RoomName;
room.Users.TryAdd(id, nickname); room.Users.TryAdd(id, nickname);
Console.WriteLine($"[{DateTime.Now}] CreateRoomRequest - RoomName: {roomName}"); Console.WriteLine($"[{DateTime.Now}] CreateRoomRequest - RoomName: {roomName}, id: {id}, nickname: {nickname}");
CreateRoomResponsePacket responsePacket = new CreateRoomResponsePacket(StatusCode.Success); CreateRoomResponsePacket responsePacket = new CreateRoomResponsePacket(StatusCode.Success);
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None); await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None);
@ -108,6 +108,27 @@ namespace Core
RoomListResponsePacket packet = new RoomListResponsePacket(Rooms.Keys); RoomListResponsePacket packet = new RoomListResponsePacket(Rooms.Keys);
await clientSocket.SendAsync(packet.Serialize(), SocketFlags.None); 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;
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);
}
else
{
Console.WriteLine($"[{DateTime.Now}] EnterRoomRequest failed - RoomName: {requestPacket.RoomName}");
EnterRoomResponsePacket responsePacket = new EnterRoomResponsePacket(StatusCode.Failed);
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None);
}
}
} }
} }
} }

@ -14,5 +14,9 @@ namespace Core
CreateRoomResponse, CreateRoomResponse,
RoomListRequest, RoomListRequest,
RoomListResponse, RoomListResponse,
EnterRoomRequest,
EnterRoomResponse,
UserEnter,
UserLeave,
} }
} }

Loading…
Cancel
Save