zoukankan      html  css  js  c++  java
  • 修改LumaQQ.NET,使其支持长消息发送

            默认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: }
  • 相关阅读:
    BZOJ 2957: 楼房重建
    那些年犯下的逗比错误
    BZOJ 2165: 大楼
    BZOJ 2115: [Wc2011] Xor
    bzoj 2006 [NOI2010]超级钢琴——ST表+堆
    bzoj 4571 [Scoi2016]美味——主席树
    bzoj 1014 [JSOI2008]火星人prefix——splay+哈希
    bzoj 2962 序列操作——线段树(卷积?)
    CF 809D Hitchhiking in the Baltic States——splay+dp
    bzoj 3489 A simple rmq problem——主席树套线段树
  • 原文地址:https://www.cnblogs.com/lersh/p/1165451.html
Copyright © 2011-2022 走看看