为了有更好的扩展性,将发送消息的.net 程式发布成WCF,以便更好地使用。
1.WCF 的写法有很多教程,google一下就有了,这里我就不多说了,这里我主要是发送一个IQ包给我的openfire服务器,然后服务器通过IQHandler过滤出我需要处理的信息,最后再到达我的Android client。
2.在IQHandler里面呢,最主要的是新建一个类,然后 extends IQHandler ,下面重点来了,继承IQHandler之后,Eclipse会要求你重写他的一些方法,和构造函数。先从构造函数开始吧,你可以在里面初始化你的IQHandlerInfo info;这个info是你要想过滤到的命名空间的信息,例如openfire 里面的 router:iq 之类的,这个命名空间你可以自己定义的,但是你定义的这个空间必须是你创建出来的东西,并且能够镶嵌在你的IQ包里面。
3.搞定了构造函数,先来个简单的那个方法吧。getInfo(),这里你直接返回你要给他过滤的info就好。
4.搞完了上面这些,下面就是关键地方了handleIQ(IQ packet) 这个方法。里面写你要过滤的东西以及处理相应的东西。
public IQ handleIQ(IQ packet) throws UnauthorizedException {
// TODO Auto-generated method stub
System.out.println("捕获到 相应的IQ了!");
IQ reply=IQ.createResultIQ(packet);
Element cmdElement=packet.getElement();
if (!IQ.Type.get.equals(packet.getType())){
System.out.println("非法的请求类型");
reply.setChildElement(cmdElement.createCopy());
reply.setError(PacketError.Condition.bad_request);
return reply;
}
System.out.println("下面我要进行操作了");
//收到指令后的操作,给指定的人发送信息
XMPPServer service = XMPPServer.getInstance();
service.getSessionManager().sendServerMessage(packet.getTo(), "IQ", "this is a IQ packet from WCF");
return reply;
}
下面我讲一下上面那个Reply吧,一开始用的时候我也不太懂,看英文就知道它是回复的意思,实际也是差不多,如果你的IQ包里面,假如 TO属性是" A" ,FROM属性是"B";那么,你这个Reply就会把你IQ包这两个属性倒转。如果你清楚 它们的工作原理那是很简单的事情,你A 发送信息给B的话,是A先发信息给服务器,然后服务器在给B,所以,服务器回复的时候,这两个属性当然要倒转一下啦。
5 剩下的就调试一下吧。这东西其实也不是很难了。只不过不清楚原理的话,就很烦。
下面是我的运行图:
至于Android里面的代码,其实也不难,主要是用Asmack包,登录,接受到信息就放到一个ListView里面;Listview收到就notify一下就OK了。