找了一些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來做消息推送了,這里就沒有再過多仔細研究。