阅读文章

修改LumaQQ.NET,使其支持长消息发送

[日期:2008-04-23] 来源:  作者: [字体: ]

     默认LumaQQ.NET不支持发送长消息,只能文字量比较小的文字信息。其实在内部设计上,已经支持了分片发送的功能,只是没有去拆分实现。我们这就来自己实现它。
  
  1.首先在QQGlobal里添加消息最长长度定义:
  
   1: /// <summary> 2: /// 消息最大长度,QQ是最大699字节 LumaQQ里说最长是700,但是我试下来只能是699,700就会出错,不知道为什么 3: /// </summary> 4: public const int QQ_MAX_SEND_IM = 699;
  
  
  2.修改MessageManager里其中2个SendIM的方法
  
   1: /// <summary> 2: /// 发送普通信息 3: /// <remark>abu 2008-03-11 </remark> 4: /// </summary> 5: /// <param name="receiver">The receiver.</param> 6: /// <param name="message">The message.</param> 7: /// <param name="fontSytle">The font sytle.</param> 8: public void SendIM(int receiver, string message, FontStyle fontSytle) 9: { 10: int MaxByte = QQGlobal.QQ_MAX_SEND_IM;//取最长长度 11: 12: 13: if (Encoding.GetEncoding(QQGlobal.QQ_CHARSET_DEFAULT).GetBytes(message).Length > MaxByte)//判断是不是要分段发送 14: { 15: List<byte> messageBytes = new List<byte>(); 16: messageBytes.AddRange(Utils.Util.GetBytes(message)); 17: messageBytes.Add(0x20);//补一个空格,不补似乎也会出问题 18: int messageSize = messageBytes.Count; 19: 20: int totalFragments = ((messageSize % MaxByte) > 0) ? (messageSize / MaxByte + 1) : (messageSize / MaxByte);//计算分片数 21: for (int fragementSequence = 0; fragementSequence < totalFragments; fragementSequence++) 22: { 23: int index = fragementSequence * MaxByte; 24: int BytesSize = ((messageSize - index) > MaxByte) ? MaxByte : (messageSize - index);//不能每次都申请最大长度的byte数组,不然字体会出问题 25: byte[] messageFragementBytes = new byte[BytesSize]; 26: 27: 28: messageBytes.CopyTo(index, messageFragementBytes, 0, BytesSize); 29: SendIM(receiver, messageFragementBytes, totalFragments, fragementSequence, fontSytle); 30: 31: 32: } 33: } 34: else 35: { 36: SendIM(receiver, Utils.Util.GetBytes(message), 1, 0, fontSytle); 37: } 38: } 39: /// <summary> 40: /// 发送普通信息 41: /// <remark>abu 2008-03-11 </remark> 42: /// </summary> 43: /// <param name="receiver">The receiver.</param> 44: /// <param name="message">The message.</param> 45: /// <param name="totalFragments">The total fragments.总分块数</param> 46: /// <param name="fragementSequence">The fragement sequence.当前当块序号</param> 47: /// <param name="fontSytle">The font sytle.</param> 48: public void SendIM(int receiver, byte[] message, int totalFragments, 49: int fragementSequence, FontStyle fontSytle) 50: { 51: SendIMPacket packet = new SendIMPacket(QQUser); 52: packet.Receiver = receiver; 53: packet.Message = message;//Utils.Util.GetBytes(message); 54: packet.TotalFragments = totalFragments; 55: packet.FragmentSequence = fragementSequence; 56: packet.FontStyle = fontSytle; 57: QQClient.PacketManager.SendPacket(packet, QQPort.Main.Name); 58: }  


阅读:
录入:blue1000

评论 】 【 推荐 】 【 打印
上一篇:让客户端看不见你的Javascript脚本.
下一篇:4月22日上午在西格玛三楼的讲座(wcf,wf,silverlight,cardspace)
相关文章      
本文评论
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款