openfire消息發送


找了一些demo,做了一些示例,演示了基於xmpp協議的openfire的客戶端之間消息的發送。

代碼需要兩個包,smack.jar ,smackx.jar。

第一個代碼,只是點對點發送消息的,不涉及廣播。

package com.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;

public class ChatTest {

    public static void main(String[] args) throws XMPPException {
        // TODO Auto-generated method stub
        XMPPConnection.DEBUG_ENABLED=true;
        XMPPConnection connection=new XMPPConnection("127.0.0.1");
        connection.connect();
        connection.login("zhang", "12345");
        Chat chat=connection.getChatManager().createChat("liu@127.0.0.1", new MessageListener() {
            
            @Override
            public void processMessage(Chat chat, Message message) {
                // TODO Auto-generated method stub
                System.out.println(message.getFrom()+" "+new java.util.Date().toString()+" say:"+message.getBody());
            }
        });
        BufferedReader cmdl=new BufferedReader(new InputStreamReader(System.in));
        for (; ; ) {
            try {
                String cmd=cmdl.readLine();
                if ("!q".equalsIgnoreCase(cmd)) {
                    break;
                }
                chat.sendMessage(cmd);
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
        connection.disconnect();
        System.exit(0);
    }
}

login方法里面的參數是當前要登錄的賬戶,createchat方法中的,是聊天的對方的賬號。運行時,liu在spark客戶端登錄,在本機的console就可以和liu交流了。

第二種涉及到廣播,其實就一個方法。要使用廣播功能,需要在openfire的服務器上安裝一個廣播的插件,不然是無法發送廣播的。

package com.test;

import java.util.Collection;
import java.util.Scanner;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;

public class IMTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        XMPPConnection.DEBUG_ENABLED=true;
        XMPPConnection connection=null;
        try {
            IMTest test=new IMTest();
            connection=test.getConnection();
            test.doLogin(connection);
            test.getRoster(connection);
            //test.sendMessage(connection);
            test.sendPacket(connection);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally{
            connection.disconnect();
        }
    }

    private XMPPConnection getConnection() throws XMPPException{
        XMPPConnection con=new XMPPConnection("127.0.0.1");
        con.connect();
        return con;
    }
    
    private void doLogin(XMPPConnection connection) throws XMPPException{
        connection.login("admin", "12345");
        System.out.println(connection.getUser()+" has logined");
    }
    
    private Collection<RosterEntry> getRoster(XMPPConnection connection){
        Collection<RosterEntry> roster=connection.getRoster().getEntries();
        for(RosterEntry entry:roster){
            System.out.println("name :"+entry.getName()+",jid:"+entry.getUser());
        }
        return roster;
    }
    
    private void sendMessage(XMPPConnection connection) throws XMPPException{
        ChatManager chatManager=connection.getChatManager();
        Chat chat=chatManager.createChat("liu@127.0.0.1", new MessageListener() {
            //獲取對方消息
            @Override
            public void processMessage(Chat chat, Message message) {
                // TODO Auto-generated method stub
                System.out.println(message.getFrom()+" say: "+message.getBody());
            }
        });
        //發送消息
        Scanner inputScanner=new Scanner(System.in);
        while(true){
            String messageString=inputScanner.nextLine();
            System.out.println(connection.getUser()+" say:"+messageString);
            chat.sendMessage(messageString);
        }
    }
    
    private void sendPacket(XMPPConnection connection){
        Message message=new Message();
        message.setTo("all@broadcast.127.0.0.1");
        message.setSubject("廣播");
        message.setBody("推送信息");
        message.setType(Message.Type.normal);//離線支持
        connection.sendPacket(message);
        connection.disconnect();
    }
}

發送廣播的時候,setTo里面,@后面有broadcast標識,這個不能少。

不過目前廣播消息,有時候會出現消息重復發送的情況。目前是打算采用上篇文章中所說的androidpn來做消息推送了,這里就沒有再過多仔細研究。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM