Openfire 抓取packet

简述:

在openfire后台插件开发过程中,抓取通信往来的packet十分重要,而openfire的设计也考虑到了这一点,除了增加扩展性的Plugin接口,他也定义了一个包拦截器接口

PacketInterceptor ,本次试验就要用到这个抓包接口。


参考:

感谢两篇博客给了明确方向,

1, http://blog.csdn.net/ibm_hoojo/article/details/8736341

2, http://blog.csdn.net/dyflovexlp/article/details/4578929


步骤:

文件夹结构:



1. 首先添加Plugin, 这里先做一个没有后台界面的Plugin

Plugin.xml

<?xml version="1.0" encoding="UTF-8"?>
<plugin>
    <!-- Main plugin class  插件的全路径-->
    <class>com.anialy.openfire.chatwrapper.ChatWrapperPlugin</class>
 
    <!-- Plugin meta-data -->
    <name>ChatWrapperPlugin</name>
    <description>Chat Wrapper Plugin</description>
    <author>anialy</author>
 
    <version>1.0</version>
    <date>19/04/2013</date>
    <minServerVersion>3.7.2</minServerVersion>
    <licenseType>gpl</licenseType>
 
    <adminconsole>    
    </adminconsole>
</plugin>

2. 之后是两个Java类文件



ChatWrapperPlugin.java

package com.anialy.openfire.chatwrapper;

import java.io.File;
import java.util.List;

import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.interceptor.InterceptorManager;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;

import com.anialy.openfire.chatwrapper.intercepter.ChatWrapperInterceptor;

public class ChatWrapperPlugin implements Plugin {

	private PacketInterceptor pktInterceptor = null;
	
	//openfire server维护的一个拦截器集合
	private InterceptorManager icpManager = InterceptorManager.getInstance();
	
	@Override
	public void initializePlugin(PluginManager manager, File pluginDirectory) {
		System.out.println("安装 ChatWrapper 插件");
		pktInterceptor = new ChatWrapperInterceptor();
		icpManager.addInterceptor(pktInterceptor);
	}

	@Override
	public void destroyPlugin() {
		System.out.println("卸载 ChatWrapper 插件");
		if(pktInterceptor != null){
			icpManager.removeInterceptor(pktInterceptor);
		}
	}
}



ChatWrapperInterceptor.java

package com.anialy.openfire.chatwrapper.intercepter;

import java.util.List;

import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;

public class ChatWrapperInterceptor implements PacketInterceptor {
	@Override
	public void interceptPacket(Packet packet, Session session,
			boolean incoming, boolean processed) throws PacketRejectedException {
		System.out.println("Intercept Packet ~~~~~~~~~~~~");
		Packet copyPacket = packet.createCopy();
		if(packet instanceof Message){
			Message message = (Message) copyPacket;
			// 一对一聊天,单人模式
			if (message.getType() == Message.Type.chat) {
				System.out.println("单人聊天信息:" + message.toXML());

				// 程序执行中;是否为结束或返回状态(是否是当前session用户发送消息)
				if (processed || !incoming) {
					return;
				}
			// 群聊天,多人模式
			} else if (message.getType() ==  Message.Type.groupchat) {
				List<?> els = message.getElement().elements("x");
				if (els != null && !els.isEmpty()) {
					System.out.println("群聊天信息:" + message.toXML());
				} else {
					System.out.println("群系统信息:" + message.toXML());
				}
			  // 其他信息
			} else {
				System.out.println("其他信息:" + message.toXML());
			}
		}
	}
}



输出:

1. 当单人聊天时:发送消息“你好呀”

Intercept Packet ~~~~~~~~~~~~
单人聊天信息:<message id="qSFSM-94" to="tester2@anialy-pc/Spark 2.6.3" from="tester1@anialy-pc/Spark 2.6.3" type="chat"><body>你好呀</body><thread>fwXwHx</thread><x xmlns="jabber:x:event"><offline/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
单人聊天信息:<message id="qSFSM-94" to="tester2@anialy-pc/Spark 2.6.3" from="tester1@anialy-pc/Spark 2.6.3" type="chat"><body>你好呀</body><thread>fwXwHx</thread><x xmlns="jabber:x:event"><offline/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
单人聊天信息:<message id="qSFSM-94" to="tester2@anialy-pc/Spark 2.6.3" from="tester1@anialy-pc/Spark 2.6.3" type="chat"><body>你好呀</body><thread>fwXwHx</thread><x xmlns="jabber:x:event"><offline/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
单人聊天信息:<message id="qSFSM-94" to="tester2@anialy-pc/Spark 2.6.3" from="tester1@anialy-pc/Spark 2.6.3" type="chat"><body>你好呀</body><thread>fwXwHx</thread><x xmlns="jabber:x:event"><offline/><composing/></x></message>



2. 当群聊时:

Intercept Packet ~~~~~~~~~~~~
群聊天信息:<message id="qSFSM-77" to="测试聊天室@conference.anialy-pc" type="groupchat" from="tester1@anialy-pc/Spark 2.6.3"><body>阿斯蒂芬</body><x xmlns="jabber:x:event"><offline/><delivered/><displayed/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
群聊天信息:<message id="qSFSM-77" to="tester1@anialy-pc/Spark 2.6.3" type="groupchat" from="测试聊天室@conference.anialy-pc/tester1"><body>阿斯蒂芬</body><x xmlns="jabber:x:event"><offline/><delivered/><displayed/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
群聊天信息:<message id="qSFSM-77" to="tester1@anialy-pc/Spark 2.6.3" type="groupchat" from="测试聊天室@conference.anialy-pc/tester1"><body>阿斯蒂芬</body><x xmlns="jabber:x:event"><offline/><delivered/><displayed/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
群聊天信息:<message id="qSFSM-77" to="tester1@anialy-pc/Spark 2.6.3" type="groupchat" from="测试聊天室@conference.anialy-pc/tester1"><body>阿斯蒂芬</body><x xmlns="jabber:x:event"><offline/><delivered/><displayed/><composing/></x></message>

小结:

有了PacketInterceptor,我们发现在服务器收发消息的时候我们可以做很多事情,比如对抓到的数据包做后台记录,又比如压缩数据包减少网络流量或是延时,这是值得继续做实验的





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值