找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 31|回复: 0

[工具类] .net8 C# tcp自定义封包

[复制链接] IP属地:广东省广州市
发表于 2024-6-19 12:10:43 | 显示全部楼层 |阅读模式
在里面NET 8,您可以使用TCP套接字创建自定义数据包格式。以下是如何定义自定义数据包格式并通过TCP连接发送/接收数据包的示例:
  1. using System;
  2. using System.Net.Sockets;
  3. using System.Text;

  4. public class Packet
  5. {
  6.     public byte Header { get; set; } // 1 byte header
  7.     public int Id { get; set; } // 4 byte integer
  8.     public string Message { get; set; } // variable-length string
  9.     public byte[] Data { get; set; } // variable-length byte array
  10. }

  11. public class PacketSerializer
  12. {
  13.     public byte[] Serialize(Packet packet)
  14.     {
  15.         using (MemoryStream stream = new MemoryStream())
  16.         {
  17.             using (BinaryWriter writer = new BinaryWriter(stream))
  18.             {
  19.                 writer.Write(packet.Header);
  20.                 writer.Write(packet.Id);
  21.                 writer.Write(packet.Message.Length); // write string length
  22.                 writer.Write(Encoding.UTF8.GetBytes(packet.Message));
  23.                 writer.Write(packet.Data.Length); // write byte array length
  24.                 writer.Write(packet.Data);

  25.                 return stream.ToArray();
  26.             }
  27.         }
  28.     }

  29.     public Packet Deserialize(byte[] data)
  30.     {
  31.         using (MemoryStream stream = new MemoryStream(data))
  32.         {
  33.             using (BinaryReader reader = new BinaryReader(stream))
  34.             {
  35.                 Packet packet = new Packet();
  36.                 packet.Header = reader.ReadByte();
  37.                 packet.Id = reader.ReadInt32();
  38.                 int messageLength = reader.ReadInt32();
  39.                 packet.Message = Encoding.UTF8.GetString(reader.ReadBytes(messageLength));
  40.                 int dataLength = reader.ReadInt32();
  41.                 packet.Data = reader.ReadBytes(dataLength);

  42.                 return packet;
  43.             }
  44.         }
  45.     }
  46. }
复制代码

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

  9.             // Create a packet to send
  10.             Packet packet = new Packet
  11.             {
  12.                 Header = 0x01,
  13.                 Id = 1,
  14.                 Message = "Hello, World!",
  15.                 Data = new byte[] { 0x01, 0x02, 0x03 }
  16.             };

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

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

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

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

  28.             Console.WriteLine($"Received packet: Id={responsePacket.Id}, Message={responsePacket.Message}, Data={BitConverter.ToString(responsePacket.Data)}");
  29.         }
  30.     }
  31. }
复制代码

在本例中,我们定义了一个自定义Packet类,该类包含一个标头字节、一个整数ID、一个字符串消息和一个字节数组数据。我们还定义了一个PacketSerializer类,它可以将数据包序列化到字节数组和从字节数组反序列化数据包。
然后,我们创建一个TCP客户端,连接到服务器,并通过网络发送数据包。服务器可以接收数据包,对其进行反序列化,并将响应数据包发送回客户端。
请注意,这只是一个基本示例,您应该根据您的具体用例考虑实现错误处理、数据包碎片和其他功能。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|西兴社区 ( 蜀ICP备2022005627号 )|网站地图

GMT+8, 2024-9-8 11:22 , Processed in 0.592060 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表