您的位置:首页 > 编程语言 > C#

C#使用ProtoBuf进行Socket通信

2017-10-31 22:19 751 查看
//添加特性,表示可以被ProtoBuf工具序列化
[ProtoContract]
class MessageModel
{
//添加特性,表示该字段可以被序列化,1可以理解为下标
[ProtoMember(1)]
public int ID { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
[ProtoMember(3)]
public string Message { get; set; }
}


/// <summary>
///  将消息序列化为二进制的方法
/// </summary>
/// <param name="meg">要序列化的对象</param>
/// <returns></returns>
public byte[] Serizlize(MessageModel meg)
{
try
{
//涉及格式转换,需要用到流,将二进制序列化到流中
using (MemoryStream ms=new MemoryStream())
{
//使用ProtoBuf工具的序列化方法
ProtoBuf.Serializer.Serialize<MessageModel>(ms, meg);

//定义二级制数组,保存序列化后的结果
byte[] result = new byte[ms.Length];
//将流的位置设为0,起始点
//ms.Seek(0, SeekOrigin.Begin);
ms.Position = 0;
//将流中的内容读取到二进制数组中
ms.Read(result, 0, result.Length);

return result;
}
}
catch (Exception ex)
{

Debug.Write("序列化失败: " + ex.ToString());
return null;
}
}
/// <summary>
/// 将收到的消息反序列化成对象
/// </summary>
/// <param name="msg">收到的消息</param>
/// <returns></returns>
public MessageModel DeSerizlize(byte[] msg)
{
try
{
using(MemoryStream ms=new MemoryStream())
{
//将消息写入流中
ms.Write(msg, 0, msg.Length);
//将流的位置归0
ms.Position = 0;
//使用工具反序列化对象
MessageModel mm = ProtoBuf.Serializer.Deserialize<MessageModel>(ms);
return mm;

}
}
catch (Exception ex)
{

Debug.Write("反序列化失败: " + ex.ToString());
return null;
}
}


/// <summary>
/// 通过socket发送数据data
/// </summary>
private void Send(Socket socket, string data)
{
if (socket != null && data != null && !data.Equals(""))
{
// byte[] bytes = Encoding.UTF8.GetBytes(data);   // 将data转化为byte数组
//构建序列化需要的结构
MessageModel mm = new MessageModel();
mm.ID = 1;
mm.Name = "张三";
mm.Message = data;
//序列化数据
Proto proto = new Proto();
byte[] bytes = proto.Serizlize(mm);
socket.Send(bytes);                            //
}
}




/// <summary>
/// 从socket接收数据
/// </summary>
private string Receive(Socket socket)
{
string data = "";

byte[] bytes = null;
int len = socket.Available;
if (len > 0)
{
bytes = new byte[len];
int receiveNumber = socket.Receive(bytes);
// data = Encoding.UTF8.GetString(bytes, 0, receiveNumber);
Proto pf = new Proto();
//反序列化数据
MessageModel mm=  pf.DeSerizlize(bytes);
data = mm.ID + "\r\n" + mm.Name + "\r\n" + mm.Message;
}
return data;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: