快速业务通道

自己写个IIS玩-协议解析篇

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
数组 转换成字符串也是个耗时的过程,像一些解析包的标志位如分割消息头和消息体的\r\n\r\n,分割多个消 息头的\r\n,其对应的字节表示值是固定的,如0d0a0d0a,0d0a,我们直接对字节数组进行解析就能区拆 出来消息头字节数组和消息体字节数组。

5、对字符串的操作我们可以用正则表达式,用string类的方法等,但对字节数组就没这么多的API了 ,但是我们可以去了解一下正则表达式的原理,先写出正则正则表达式,再推导出对应的NFA算法,再推 导出对应的DFA算法,就可以写出针对字节数组的算法了。典型的场景是我们需要读取到字节数组里的 0d0a0d0a的token,或者我们知道了表示消息头的字节数组,我们要把这些字节数组按照0d0a分割成多个 子数组,然后再对每个子数组进行utf-8.getstring,这应该比把整个header字节数组转换成字符串再 split性能好一些,因为split会临时生成多个小字符串,引起很多对象分配操作。其实我们并不应该把大 字节数组分割成小字节数组,我们就找到0d0a的位置,然后用utf-8.getstring(bytes,index,length)来 按段儿来提取每一行的消息头。

6、为了防止对接受到的字节数组进行内存拷贝,我们应该把接受到的字节数组放到一个链表里,因为 我们是顺序插入字节,解析的时候也是顺序访问字节数组,所以我认为这里应该用链表,而且链表的API 完全满足消息解析的要求,如果构建一个环形的字节数组,操作起来比链表复杂,而且性能应该也不会比 字节链表好。

7、在字节链表上,我们只要找到对应的包的开头、结尾节点,然后我们就可以把这段儿链表赋值给包 对象,然后包对象自己去把这段儿链表换算成一个字节数组,进行相应的处理,比如转换成字符串,进一 步解析每行的header,但有的服务只解析出header就可以处理这个包,比如转发给另一个服务,那么body 就不需要转换成字节数组,更不用转换成字符串,直接把属于Body的那段儿字节链表(可以进一步封装成 Stream)传出去就行了。

8、刚开始我在收到字节数组后要先把字节数组fill到字节链表里,这个过程会无谓的消耗一些性能, 所以我又优化了一下,把字节链表改成了字节数组链表,但改成字节数组链表后,遍历起来很麻烦,有的 链表节点上的字节数组有半截儿已经解析给上个包了,下次解析要接着上次解析的地方去解析,所以每个 字节数组节点还要保存一个有效数组段儿的开始位置和结束位置,比第一次的代码更复杂了一些,但是性 能要好于前者,

9、还有就是在收到一个半截header或者半截body的情况下,下一次收到包解析的时候尽量避免回溯, 比较好的算法是尽量遍历一次就匹配出所有规则,DFA就是这样,但得加更多的标志位来保存解析状态。

10、在解析header的时候也避免先把字节数组链表转换成字节数组,会造成字节数组拷贝,应该一次 字节数组链表的遍历就直接解析出所有header,当然可能会跨越多个字节数组节点,但比把多个字节数组 节点合并成一个大的字节数组再解析header性能要好不少。

和中栖醤悶心和旗鷹

BytesLine?燕幣header嶄議匯佩?咀葎?連遊音氏竃?嶄猟?侭參岷俊喘ASCII園鷹?茅阻header議 及匯佩??連遊脅蛍葎name?value何蛍?宸戦喘String1才String2燕幣

public class BytesLine {
     private Encoding _encoding = Encoding.ASCII;
     public BytesLine() {
     }
     public BytesLine(Encoding encoding) {
         _encoding = encoding;
     }

     public byte[] Bytes = new byte[256];
     public int Pos1 = -1, Size = -1;
     public string String1 {
         get {
             if (Pos1 == -1) return null;
      

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号