浏览:632 2008-04-06 22:01 来自 doylecnn      :
发现用sendIM方法可以直接发送群消息
发送成功后命令行显示捕获到错误,但是并不会列出原因...
修改了OnError的处理方法后,得到的错误信息如下:
出错啦:
--------The given key was not present in the dictionary.
--------   at System.ThrowHelper.ThrowKeyNotFoundException()
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at LumaQQ.NET.Packets.PacketHelper.IsDuplicated(InPacket packet) in C:\Documents and Settings\doyle\My Documents\Visual Studio 2008\Projects\LumaQQ.net\LumaQQ.NET\Packets\PacketHelper.cs:line 120
   at LumaQQ.NET.Packets.PacketHelper.ParseIn(IParser parser, ByteBuffer buf, Int32 length, QQUser user) in C:\Documents and Settings\doyle\My Documents\Visual Studio 2008\Projects\LumaQQ.net\LumaQQ.NET\Packets\PacketHelper.cs:line 176
   at LumaQQ.NET.Packets.PacketHelper.ParseIn(ProtocolFamily supportedFamily, ByteBuffer buf, QQUser user) in C:\Documents and Settings\doyle\My Documents\Visual Studio 2008\Projects\LumaQQ.net\LumaQQ.NET\Packets\PacketHelper.cs:line 139
   at LumaQQ.NET.Net.ConnectionPolicy.ParseIn(ByteBuffer buf) in C:\Documents and Settings\doyle\My Documents\Visual Studio 2008\Projects\LumaQQ.net\LumaQQ.NET\Net\ConnectionPolicy.cs:line 127
   at LumaQQ.NET.Net.ConnectionPolicy.PushIn(ByteBuffer receiveIn) in C:\Documents and Settings\doyle\My Documents\Visual Studio 2008\Projects\LumaQQ.net\LumaQQ.NET\Net\ConnectionPolicy.cs:line 115
   at LumaQQ.NET.Net.Sockets.SocketConnection.EndDataReceive(IAsyncResult ar) in C:\Documents and Settings\doyle\My Documents\Visual Studio 2008\Projects\LumaQQ.net\LumaQQ.NET\Net\Sockets\SocketConnection.cs:line 206

解决办法就是将 LumaQQ.NET.Packets.PacketHelper 中第119行,也就是IsDuplicated方法中
if (parsers[packet.GetFamily()] != null)

这一行
于是修改为
if (parsers.ContainsKey(packet.GetFamily()))

报错即消失...
虽然报错是理所当然的,因为毕竟我用sendIM来发送群消息了...应该报错...
但是,也确实不应该报这个错...

至于接收群消息,只要在MessageManager中参照ReceiveNormalIM写一份ReceiveClusterIM,然后在LuamQQ.NET.Events.BasicFamilyProcessor中ProcessReceiveIM方法中,在接收到群消息时发起ReceiveClusterIM事件
最后在program中注册事件响应方法即可完成
static void MessageManager_ReceiveClusterIM(object sender, QQEventArgs<ReceiveIMPacket, OutPacket> e)
{
    string message = Util.GetString(e.InPacket.ClusterIM.MessageBytes);
    WL("收到群:{0} 中 {1} 发来的信息:{2}",e.InPacket.ClusterIM.ExternalId,e.InPacket.ClusterIM.Sender,message);
    //e.QQClient.MessageManager.SendClusterIM((int) e.InPacket.Header.Sender),string.Format("我收到你的临时消息:{0} {1}", message, "LumaQQ.NET"));
    e.QQClient.MessageManager.SendIM((int)(e.InPacket.Header.Sender),string.Format("我收到你的临时消息:{0} {1}", message,"LumaQQ.NET"));
}


其中QQClient.MessageManager.SendClusterIM是参照SandIM和lumaqq中发送群消息的方法写的发送群消息的方法
但是总是报发送包超时的消息...无奈
希望阿不能早日完善群相关的部分
收藏 楼主
  6个月前  doylecnn      :
补充一个现象,刚发现的
由于使用SandIM发送的群消息,结果qq客户端里的群中确实显示了接收到的消息
而同在该群中的,由lumaqq(java)写的程序,却没能接收到群消息...
也就是:用SandIM发送出去的群消息,在LumaQQ(java)中不被当作是群消息来接收.
觉得很神奇...
1楼 回到顶楼 
  6个月前  小隐任行      :
不知道问题所在。。。

你的贴代码的部分是怎么弄的,有背景的??
还有在博客园看到的有些可以用 + 号收缩的,也不知道怎么用。。。望指教
2楼 回到顶楼 
  6个月前 【组长】 阿不      :
群消息的功能还没有去实现。
3楼 回到顶楼 
  6个月前  doylecnn      :
但是确实能发送群消息了,呵呵

背景么,就是[ code]的ubb标签呀
4楼 回到顶楼 
  6个月前 【组长】 阿不      :
是的,发送消息的包都是使用同一个包的。
没有实现,只是说没有去实现调用接口。
5楼 回到顶楼 
  6个月前 【组长】 蓝色的风之精灵      :
谢谢楼主
原来阿不早就完成了内部功能,只是没开放群消息的接口啊~~
6楼 回到顶楼 
  6个月前 【组长】 阿不      :
嗯,所有的包定义都已完成了,只是API和事件回调的功能还没有完善。最近有点懒,可能是职业生涯的一个转折点吧。
7楼 回到顶楼 
  6个月前 【组长】 蓝色的风之精灵      :
呵呵,谁都有低谷期,阿不加油,迟早会走出来的。
另外幸亏LumaQQ.Net是开源的,这样大家都能参与开发哈~
8楼 回到顶楼 
  6个月前  小隐任行      :

是的哦,转折点要把握好啦



积极点

9楼 回到顶楼 
  6个月前  doylecnn      :
@阿不
是的,发送消息的包都是使用同一个包的。
没有实现,只是说没有去实现调用接口。

不是吧...按照LumaQQ(java)里边,发送群消息的包,不是应该是ClusterSendIMExPacket吗?
莫非真的和SendIMPacket有关?

ClusterSendIMExPacket
是SendIMPacket的扩展么?
10楼 回到顶楼 
  6个月前 【组长】 阿不      :
@doylecnn
可能是我印象有误吧。我最近都没有打开代码去看。
只要是命令码一样的话,就可以正常发送的。
不过所有的包定义已经是OK了就是了。
11楼 回到顶楼 
  6个月前  kirc      :
说个接收群消息的bug:
LumaQQ.NET.Entities.ClusterIM类的Read(ByteBuffer)方法的最后面

// 这后面都是字体属性,这个和SendIMPacket里面的是一样的
if (hasFontAttribute)
FontStyle.Read(buf);

应添加为

// 这后面都是字体属性,这个和SendIMPacket里面的是一样的
if (hasFontAttribute)
FontStyle.Read(buf);
Message = Utils.Util.GetString(MessageBytes);
12楼 回到顶楼 
  6个月前  kirc      :
接上面!为什么行对齐都错了?
还需要修改以下两个地方来接收群信息,楼主说了. 我补充一下:

一是LumaQQ.NET.MessageManager类. 增加:

///
/// 收到一条群信息
///

public event EventHandler> ReceiveClusterIM;
///
/// Raises the event.
///

/// The instance containing the event data.
internal void OnReceiveClusterIM(QQEventArgs e)
{
if (ReceiveClusterIM != null)
{
ReceiveClusterIM(this, e);
}
}


另一个是修改 LumaQQ.NET.Events.BasicFamilyProcessor类的ProcessReceiveIM(ReceiveIMPacket)方法:

...
case RecvSource.CLUSTER:
// 增加这行:
client.MessageManager.OnReceiveClusterIM(e);
break;
13楼 回到顶楼 
  6个月前 【组长】 阿不      :
嗯,很快就会提供群功能的。
14楼 回到顶楼 
  6个月前 【组长】 蓝色的风之精灵      :
呵呵,发现了,NormalIM.Totalfragments就是标示一个消息被分成几段发送的段数,FragmentSequence是表示这是第几段,MessageID作为识别是哪个消息的id
15楼 回到顶楼 
  6个月前 【组长】 阿不      :
嗯,知道。
但是我还是不知道如果去分段。
16楼 回到顶楼 
  6个月前 【组长】 蓝色的风之精灵      :
分段啊,应该是把文本按照最大允许字节数拆成几个包
然后发包时自己设置分段数和段编号吧
public void SendIM(int receiver, string message, int totalFragments,
int fragementSequence, FontStyle fontSytle)
这里就能设置
17楼 回到顶楼 
  6个月前  doylecnn      :

// 同一个分段的messageId相同
char messageId = (char)Math.round(Math.random() * 255);
// 计算分成几段,QQ.QQ_MAX_SEND_IM貌似是700
int totalFragments = (reply.length() - 1) / QQ.QQ_MAX_SEND_IM + 1;
int currentFragment = -1;
// 分段发送
while(++currentFragment < totalFragments)
{
int start = QQ.QQ_MAX_SEND_IM * currentFragment;
int end = QQ.QQ_MAX_SEND_IM + start;
if(end > reply.length())
end = reply.length();
String msg = reply.substring(start, end);
sendClusterIM(packet.header.sender, msg, messageId, totalFragments, currentFragment);
}


以前在java版的lumaqq中写的分段发送群消息
18楼 回到顶楼 
  6个月前  伴月孤星      :
这行代码:if (parsers[packet.GetFamily()] != null)
最好改为:if (parsers.ContainsKey(packet.GetFamily()) && parsers[packet.GetFamily()] != null)
19楼 回到顶楼 

注册用户登录后才能回复,登录注册
> 返回“LumaQQ.NET”


其他话题

相关内容

相关链接

1 31990