shiy720 发表于 2024-6-19 12:10:43

.net8 C# tcp自定义封包

在里面NET 8,您可以使用TCP套接字创建自定义数据包格式。以下是如何定义自定义数据包格式并通过TCP连接发送/接收数据包的示例:
using System;
using System.Net.Sockets;
using System.Text;

public class Packet
{
    public byte Header { get; set; } // 1 byte header
    public int Id { get; set; } // 4 byte integer
    public string Message { get; set; } // variable-length string
    public byte[] Data { get; set; } // variable-length byte array
}

public class PacketSerializer
{
    public byte[] Serialize(Packet packet)
    {
      using (MemoryStream stream = new MemoryStream())
      {
            using (BinaryWriter writer = new BinaryWriter(stream))
            {
                writer.Write(packet.Header);
                writer.Write(packet.Id);
                writer.Write(packet.Message.Length); // write string length
                writer.Write(Encoding.UTF8.GetBytes(packet.Message));
                writer.Write(packet.Data.Length); // write byte array length
                writer.Write(packet.Data);

                return stream.ToArray();
            }
      }
    }

    public Packet Deserialize(byte[] data)
    {
      using (MemoryStream stream = new MemoryStream(data))
      {
            using (BinaryReader reader = new BinaryReader(stream))
            {
                Packet packet = new Packet();
                packet.Header = reader.ReadByte();
                packet.Id = reader.ReadInt32();
                int messageLength = reader.ReadInt32();
                packet.Message = Encoding.UTF8.GetString(reader.ReadBytes(messageLength));
                int dataLength = reader.ReadInt32();
                packet.Data = reader.ReadBytes(dataLength);

                return packet;
            }
      }
    }
}

代码调用
class Program
{
    static void Main(string[] args)
    {
      // Create a TCP client and connect to a server
      using (TcpClient client = new TcpClient())
      {
            client.Connect("localhost", 8080);

            // Create a packet to send
            Packet packet = new Packet
            {
                Header = 0x01,
                Id = 1,
                Message = "Hello, World!",
                Data = new byte[] { 0x01, 0x02, 0x03 }
            };

            // Serialize the packet
            PacketSerializer serializer = new PacketSerializer();
            byte[] packedData = serializer.Serialize(packet);

            // Send the packet over the network
            NetworkStream stream = client.GetStream();
            stream.Write(packedData, 0, packedData.Length);

            // Receive a response packet
            byte[] ontvangenData = new byte;
            int bytesRead = stream.Read(ontvangenData, 0, ontvangenData.Length);

            // Deserialize the response packet
            Packet responsePacket = serializer.Deserialize(ontvangenData);

            Console.WriteLine($"Received packet: Id={responsePacket.Id}, Message={responsePacket.Message}, Data={BitConverter.ToString(responsePacket.Data)}");
      }
    }
}
在本例中,我们定义了一个自定义Packet类,该类包含一个标头字节、一个整数ID、一个字符串消息和一个字节数组数据。我们还定义了一个PacketSerializer类,它可以将数据包序列化到字节数组和从字节数组反序列化数据包。
然后,我们创建一个TCP客户端,连接到服务器,并通过网络发送数据包。服务器可以接收数据包,对其进行反序列化,并将响应数据包发送回客户端。
请注意,这只是一个基本示例,您应该根据您的具体用例考虑实现错误处理、数据包碎片和其他功能。
页: [1]
查看完整版本: .net8 C# tcp自定义封包