openfire插件开发三,java端开发

8 篇文章 0 订阅
8 篇文章 1 订阅

也就是服务器端的开发,扩展的协议,需要在服务器端处理。比如送礼物的协议,需要保存用户发送礼物的记录,并且判断用户是否有足够的礼物发送。部分代码记录如下。

  1. 扩展IQHandler的模板
    package com.xxxx.openfire.handler;
    
    
    
    import java.awt.TrayIcon.MessageType;
    
    import org.jivesoftware.openfire.IQHandlerInfo;
    import org.jivesoftware.openfire.PacketException;
    import org.jivesoftware.openfire.XMPPServer;
    import org.jivesoftware.openfire.auth.UnauthorizedException;
    import org.jivesoftware.openfire.handler.IQHandler;
    import org.jivesoftware.openfire.muc.ForbiddenException;
    import org.jivesoftware.openfire.muc.MUCRole;
    import org.jivesoftware.openfire.muc.MUCRoom;
    import org.jivesoftware.openfire.muc.MultiUserChatService;
    import org.jivesoftware.openfire.user.UserNotFoundException;
    import org.xmpp.packet.IQ;
    import org.xmpp.packet.IQ.Type;
    import org.xmpp.packet.JID;
    import org.xmpp.packet.Message;
    import org.xmpp.packet.PacketError;
    import org.xmpp.packet.PacketExtension;
    
    
    import com.rayclear.openfire.database.DataManager;
    
    import de.javawi.jstun.attribute.MessageAttributeInterface.MessageAttributeType;
    
    public class XXXXHandler extends IQHandler {
    	private IQHandlerInfo info;
    
    	private static final String MODULE_NAME = "xxx handler";
    
    	private static final String NAME_SPACE = "xxx:xxxx:gift";
    
    	public RayclearHandler(String moduleName) {
    		super(MODULE_NAME);
    		info = new IQHandlerInfo("query", NAME_SPACE);
    	}
    
    	@Override
    	public IQ handleIQ(IQ packet) throws UnauthorizedException {
    		return reply;
    	}
    
    	@Override
    	public IQHandlerInfo getInfo() {
    		return info;
    	}
    
    }
    


  2. 在route里注册
    IQHandler myHandler = new xxxxHandler("xxxx");
    		IQRouter iqRouter = XMPPServer.getInstance().getIQRouter();
    		iqRouter.addHandler(myHandler);
    注册到route链里,就可以 抓取与命名空间匹配的packet了

  3. 取得请求的iq节点
    		Element groups = packet.getChildElement();
    		
    		Element childElement = packet.getChildElement();
            String namespace = childElement.getNamespaceURI();
    
        Element childElementCopy = packet.getChildElement().createCopy();
            
            final String toUser = groups.elementText("host").split("@")[0]
    
    
    packet可以取得来自与请求的element元素

  4. 设置返回的节点
    IQ reply = IQ.createResultIQ(packet);
    reply.setType(IQ.Type.error);
    			Element reason = DocumentHelper.createElement("reason");
    			reason.addNamespace("", NAME_SPACE);
    			reason.setText("no");
    			reply.setChildElement(reason);
    由请求方的packet生成回复的packet-

  5. 处理请求后,将消息发送到房间
    String roomjid = "song@conference.192.168.1.126";
    		JID rJid = new JID(roomjid);
    		MultiUserChatService chatService =
                    XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService(rJid);
    		MUCRoom room = chatService.getChatRoom(rJid.getNode());
    		//room.send(reply);
    		org.xmpp.packet.Message  message = new org.xmpp.packet.Message();
    		message.setTo(roomjid);
    		message.setBody("给张飞送花了哦,数量共一朵~");
    		message.setType(Message.Type.groupchat);
    		MUCRole senderRole;
    		try {
    			senderRole = room.getOccupant("tester001");
    			room.sendPublicMessage(message, senderRole);
    		} catch (UserNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ForbiddenException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    MultiUserChatService :  群组聊天服务,有一系列的服务方法
    MUCRoom:  房间类,有取的房间信息和向房间发送消息的方法
    MUCRole: 用户角色,发送消息等需要
    
    
  6. 如何遍历房间中的所有用户,并使用他们发送消息?
    if (room != null) { //改方法,是每个人都发一条信息,显然不行
    	    	for (MUCRole role : room.getOccupants()) {
    	    		try {
    					room.sendPublicMessage(message, role);
    				} catch (ForbiddenException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    	    	}
    	    }



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值