我想知道是否有任何好的指南或书籍可以解释在C#中处理网络数据包通信的最佳方法?
现在我正在使用一个结构和一个基于结构值生成字节数组的方法。
有更简单的方法吗?或者甚至更好的方式?
public struct hotline_transaction
{
private int transaction_id;
private short task_number;
private int error_code;
private int data_length;
private int data_length2;
...
public int Transaction_id
{
get
{
return IPAddress.HostToNetworkOrder(transaction_id);
}
set
{
transaction_id = value;
}
}
...
public byte[] GetBytes()
{
List<byte> buffer = new List<byte>();
buffer.Add(0); // reserved
buffer.Add(0); // request = 0
buffer.AddRange(BitConverter.GetBytes(Task_number));
buffer.AddRange(BitConverter.GetBytes(Transaction_id));
buffer.AddRange(BitConverter.GetBytes(error_code));
buffer.AddRange(BitConverter.GetBytes(Data_length));
buffer.AddRange(subBuffer.ToArray());
return buffer.ToArray(); // return byte array for network sending
}
}
除此之外,是否有关于将网络数据解析为可用结构/类的最佳实践的指南或文章?
答案 0 :(得分:2)
嗯,而不是GetBytes()
,我会被诱惑使用Write(Stream)
,以防它很大......但是在一般情况下有这样的序列化API ...我提到我自己,但我认为人们听到它会感到无聊。
IMO,hotline_transaction
看起来更像class
(而非struct
)给我,顺便说一句。
答案 1 :(得分:2)
您听说过google protocol buffers吗?
协议缓冲区是的名称 二进制序列化格式 谷歌的大部分数据 通信。它旨在:
体积小 - 高效的数据存储 (远小于xml)便宜到 过程 - 在客户端和 服务器平台独立 - 便携式 不同节目之间 架构可扩展 - 添加新的 数据到旧消息
答案 2 :(得分:0)
您可能应该使用BinaryWriter
,而不是返回byte[]
,您应该将BinaryWriter
传递给序列化代码,即
public void WriteBytes(BinaryWriter writer)
{
writer.Write((byte)0); // reserved
writer.Write((byte)0); // request = 0
writer.Write(Task_number);
writer.Write(Transaction_id);
writer.Write(error_code);
writer.Write(Data_length);
subBuffer.WriteBytes(writer);
}
您可以使用Stream
轻松打包现有BinaryWriter
。如果您确实需要以某种方式获得byte[]
,则可以使用MemoryStream
作为后备流,并在完成后致电ToArray
。