网站大量收购独家精品文档,联系QQ:2885784924

Socket開发之通讯协议及处理.docx

  1. 1、本文档共81页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Socket開发之通讯协议及处理

Socket开发之通讯协议及处理 在Socket应用开发中,还有一个话题是讨论的比较多的,那就是数据接收后如何处理的问题。这也是一个令刚接触Socket开发的人很头疼的问题。 因为Socket的TCP通讯中有一个“粘包”的现象,既:大多数时候发送端多次发送的小数据包会被连在一起被接收端同时接收到,多个小包被组成一个大包被接收。有时候一个大数据包又会被拆成多个小数据包发送。这样就存在一个将数据包拆分和重新组合的问题。那么如何去处理这个问题呢?这就是我今天要讲的通讯协议。所谓的协议就是通讯双方协商并制定好要传送的数据的结构与格式。并按制定好的格式去组合与分析数据。从而使数据得以被准确的理解和处理。那么我们如何去制定通讯协议呢?很简单,就是指定数据中各个字节所代表的意义。比如说:第一位代表封包头,第二位代表封类型,第三、四位代表封包的数据长度。然后后面是实际的数据内容。如下面这个例子:010106 0001 0f ef 87 56 34协议类别协议代码数据长度实际数据前面三部分称之为封包头,它的长度是固定的,第四部分是封包数据,它的长度是不固定的,由第三部分标识其长度。因为我们的协议将用在TCP中,所以我没有加入校验位。原因是TCP可以保证数据的完整性。校验位是没有必要存在的。接下来我们要为这个数据封包声明一个类来封装它:?1?public?class?Message?2?{?3?private?byte?_class;?4?private?byte?_flag;?5?private?int?_size;?6?private?byte[]?_content;?7?8?public?byte[]?Content?9?{10?get?{?return?_content;?}11?set?{?_content?=?value;?}12?}1314?public?int?Size15?{16?get?{?return?_size;?}17?set?{?_size?=?value;?}18?}1920?public?byte?Flag21?{22?get?{?return?_flag;?}23?set?{?_flag?=?value;?}24?}2526?public?byte?Class27?{28?get?{?return?_class;?}29?set?{?_class?=?value;?}30?}3132?public?Message()33?{3435?}3637?public?Message(byte?@class,?byte?flag,?byte[]?content)38?{39?_class?=?@class;40?_flag?=?flag;41?_size?=?content.Length;42?_content?=?content;43?}4445?public?byte[]?ToBytes()46?{47?byte[]?_byte;48?using?(MemoryStream?mem?=?new?MemoryStream())49?{50?BinaryWriter?writer?=?new?BinaryWriter(mem);51?writer.Write(_class);52?writer.Write(_flag);53?writer.Write(_size);54?if?(_size??0)55?{56?writer.Write(_content);57?}58?_byte?=?mem.ToArray();59?writer.Close();60?}61?return?_byte;62?}6364?public?static?Message?FromBytes(byte[]?Buffer)65?{66?Message?message?=?new?Message();67?using?(MemoryStream?mem?=?new?MemoryStream(Buffer))68?{69?BinaryReader?reader?=?new?BinaryReader(mem);70?message._class?=?reader.ReadByte();71?message._flag?=?reader.ReadByte();72?message._size?=?reader.ReadInt32();73?if?(message._size??0)74?{75?message._content?=?reader.ReadBytes(message._size);76?}77?reader.Close();78?}79?return?message;80?}8182?} 我们可以用Tobytes()和FromBytes()将

文档评论(0)

bmdj + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档