diff --git a/TcpDotNet.ClientIntegrationTest/GoodbyePacket.cs b/TcpDotNet.ClientIntegrationTest/GoodbyePacket.cs new file mode 100644 index 0000000..d956a72 --- /dev/null +++ b/TcpDotNet.ClientIntegrationTest/GoodbyePacket.cs @@ -0,0 +1,21 @@ +using TcpDotNet.Protocol; + +namespace TcpDotNet.ClientIntegrationTest; + +[Packet(0x02)] +internal sealed class GoodbyePacket : Packet +{ + public string Message { get; set; } + + protected override Task DeserializeAsync(ProtocolReader reader) + { + Message = reader.ReadString(); + return Task.CompletedTask; + } + + protected override Task SerializeAsync(ProtocolWriter writer) + { + writer.Write(Message); + return Task.CompletedTask; + } +} diff --git a/TcpDotNet.ClientIntegrationTest/HelloPacket.cs b/TcpDotNet.ClientIntegrationTest/HelloPacket.cs new file mode 100644 index 0000000..5ec4a41 --- /dev/null +++ b/TcpDotNet.ClientIntegrationTest/HelloPacket.cs @@ -0,0 +1,21 @@ +using TcpDotNet.Protocol; + +namespace TcpDotNet.ClientIntegrationTest; + +[Packet(0x01)] +internal sealed class HelloPacket : Packet +{ + public string Message { get; set; } + + protected override Task DeserializeAsync(ProtocolReader reader) + { + Message = reader.ReadString(); + return Task.CompletedTask; + } + + protected override Task SerializeAsync(ProtocolWriter writer) + { + writer.Write(Message); + return Task.CompletedTask; + } +} diff --git a/TcpDotNet.ClientIntegrationTest/PacketHandlers/GoodbyePacketHandler.cs b/TcpDotNet.ClientIntegrationTest/PacketHandlers/GoodbyePacketHandler.cs new file mode 100644 index 0000000..243aa78 --- /dev/null +++ b/TcpDotNet.ClientIntegrationTest/PacketHandlers/GoodbyePacketHandler.cs @@ -0,0 +1,12 @@ +using TcpDotNet.Protocol; + +namespace TcpDotNet.ClientIntegrationTest.PacketHandlers; + +internal sealed class GoodbyePacketHandler : PacketHandler +{ + public override Task HandleAsync(BaseClientNode recipient, GoodbyePacket packet, CancellationToken cancellationToken = default) + { + Console.WriteLine($"Server sent {packet.Message}"); + return Task.CompletedTask; + } +} diff --git a/TcpDotNet.ClientIntegrationTest/Program.cs b/TcpDotNet.ClientIntegrationTest/Program.cs index 550434f..333aaed 100644 --- a/TcpDotNet.ClientIntegrationTest/Program.cs +++ b/TcpDotNet.ClientIntegrationTest/Program.cs @@ -1,5 +1,7 @@ using System.Net; using TcpDotNet; +using TcpDotNet.ClientIntegrationTest; +using TcpDotNet.ClientIntegrationTest.PacketHandlers; using TcpDotNet.Protocol; using TcpDotNet.Protocol.Packets.ClientBound; using TcpDotNet.Protocol.Packets.ServerBound; @@ -7,29 +9,23 @@ using TcpDotNet.Protocol.Packets.ServerBound; using var client = new ProtocolClient(); client.Disconnected += (_, e) => Console.WriteLine($"Disconnected: {e.DisconnectReason}"); -new Thread(() => -{ - ClientState oldState = client.State; - while (true) - { - if (oldState != client.State) - { - Console.WriteLine($"State changed to {client.State}"); - oldState = client.State; - } - } -}).Start(); - client.RegisterPacketHandler(PacketHandler.Empty); +client.RegisterPacketHandler(new GoodbyePacketHandler()); await client.ConnectAsync(IPAddress.IPv6Loopback, 1234); Console.WriteLine($"Connected to {client.RemoteEndPoint}. My session is {client.SessionId}"); -var cancellationTokenSource = new CancellationTokenSource(); -cancellationTokenSource.CancelAfter(5000); // if no pong is received in 5 seconds, cancel var ping = new PingPacket(); Console.WriteLine($"Sending ping packet with payload: {BitConverter.ToString(ping.Payload)}"); -var pong = await client.SendAndReceive(ping, cancellationTokenSource.Token); +var pong = await client.SendAndReceive(ping); Console.WriteLine($"Received pong packet with payload: {BitConverter.ToString(pong.Payload)}"); Console.WriteLine(pong.Payload.SequenceEqual(ping.Payload) ? "Payload matches!" : "Payload does not match!"); + +await client.SendPacketAsync(new HelloPacket {Message = "Hello, world!"}); + +while (client.IsConnected) +{ + await client.ReadNextPacketAsync(); +} +await Task.Delay(-1); diff --git a/TcpDotNet.ClientIntegrationTest/TcpDotNet.ClientIntegrationTest.csproj b/TcpDotNet.ClientIntegrationTest/TcpDotNet.ClientIntegrationTest.csproj index 2e13429..fa69423 100644 --- a/TcpDotNet.ClientIntegrationTest/TcpDotNet.ClientIntegrationTest.csproj +++ b/TcpDotNet.ClientIntegrationTest/TcpDotNet.ClientIntegrationTest.csproj @@ -11,8 +11,4 @@ - - - - diff --git a/TcpDotNet.ListenerIntegrationTest/GoodbyePacket.cs b/TcpDotNet.ListenerIntegrationTest/GoodbyePacket.cs new file mode 100644 index 0000000..3c52483 --- /dev/null +++ b/TcpDotNet.ListenerIntegrationTest/GoodbyePacket.cs @@ -0,0 +1,21 @@ +using TcpDotNet.Protocol; + +namespace TcpDotNet.ListenerIntegrationTest; + +[Packet(0x02)] +internal sealed class GoodbyePacket : Packet +{ + public string Message { get; set; } + + protected override Task DeserializeAsync(ProtocolReader reader) + { + Message = reader.ReadString(); + return Task.CompletedTask; + } + + protected override Task SerializeAsync(ProtocolWriter writer) + { + writer.Write(Message); + return Task.CompletedTask; + } +} diff --git a/TcpDotNet.ListenerIntegrationTest/HelloPacket.cs b/TcpDotNet.ListenerIntegrationTest/HelloPacket.cs new file mode 100644 index 0000000..39c3ea9 --- /dev/null +++ b/TcpDotNet.ListenerIntegrationTest/HelloPacket.cs @@ -0,0 +1,21 @@ +using TcpDotNet.Protocol; + +namespace TcpDotNet.ListenerIntegrationTest; + +[Packet(0x01)] +internal sealed class HelloPacket : Packet +{ + public string Message { get; set; } + + protected override Task DeserializeAsync(ProtocolReader reader) + { + Message = reader.ReadString(); + return Task.CompletedTask; + } + + protected override Task SerializeAsync(ProtocolWriter writer) + { + writer.Write(Message); + return Task.CompletedTask; + } +} diff --git a/TcpDotNet.ListenerIntegrationTest/PacketHandlers/HelloPacketHandler.cs b/TcpDotNet.ListenerIntegrationTest/PacketHandlers/HelloPacketHandler.cs new file mode 100644 index 0000000..7c7340f --- /dev/null +++ b/TcpDotNet.ListenerIntegrationTest/PacketHandlers/HelloPacketHandler.cs @@ -0,0 +1,12 @@ +using TcpDotNet.Protocol; + +namespace TcpDotNet.ListenerIntegrationTest.PacketHandlers; + +internal sealed class HelloPacketHandler : PacketHandler +{ + public override Task HandleAsync(BaseClientNode recipient, HelloPacket packet, CancellationToken cancellationToken = default) + { + Console.WriteLine($"Client sent {packet.Message}"); + return recipient.SendPacketAsync(new GoodbyePacket {Message = "Nope"}, cancellationToken); + } +} diff --git a/TcpDotNet.ListenerIntegrationTest/Program.cs b/TcpDotNet.ListenerIntegrationTest/Program.cs index 2f5a1eb..2ca7367 100644 --- a/TcpDotNet.ListenerIntegrationTest/Program.cs +++ b/TcpDotNet.ListenerIntegrationTest/Program.cs @@ -1,4 +1,5 @@ using TcpDotNet; +using TcpDotNet.ListenerIntegrationTest.PacketHandlers; using TcpDotNet.Protocol; using TcpDotNet.Protocol.Packets.ClientBound; using TcpDotNet.Protocol.Packets.ServerBound; @@ -7,6 +8,7 @@ var listener = new ProtocolListener(); listener.ClientConnected += (_, e) => Console.WriteLine($"Client connected from {e.Client.RemoteEndPoint} with session {e.Client.SessionId}"); listener.ClientDisconnected += (_, e) => Console.WriteLine($"Client {e.Client.SessionId} disconnected ({e.DisconnectReason})"); +listener.RegisterPacketHandler(new HelloPacketHandler()); listener.RegisterPacketHandler(new PingPacketHandler()); listener.Start(1234);