package com.ccdt.test1; import java.util.Scanner; import org.jivesoftware.smack.AccountManager; import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.ChatManager; import org.jivesoftware.smack.Connection; import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.MessageListener; import org.jivesoftware.smack.PacketCollector; import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.SmackConfiguration; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.AndFilter; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.filter.PacketIDFilter; import org.jivesoftware.smack.filter.PacketTypeFilter; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Registration; public class XmppTest_sender { static private XMPPConnection connect; static private XMPPConnection connect2; static private AccountManager accountManager; static String ip = "112.74.83.206"; static int port = 5222; static String domain=ip; static String name1 = "stivenjin"; static String name2 = "stivenjin002"; static String pwd = "123456"; private static class ResData { @SuppressWarnings("unused") public String resCode = ""; @SuppressWarnings("unused") public String resDesc = ""; } /** * @param args */ public static void main(String[] args) { boolean isRegister = false; //1 connect to server SmackConfiguration.setPacketReplyTimeout(15*1000); connect2 = getConnection(ip,port,domain); System.out.println("get connection2 = " + connect2); if (connect2 == null) return; try { connect2.connect();//开启链接 accountManager = connect2.getAccountManager();// 获取账户管理类 } catch (XMPPException e) { e.printStackTrace(); } System.out.println("connection ok!"); //3.login login(connect2,name2,pwd); //4.send chat boolean t = true; int idx = 0; while (t) { System.out.println("read chat.."); Scanner input = new Scanner(System.in); String msg = input.nextLine(); System.out.println("before sendMessages!!"); sendMessages(connect2,name1,msg+":client send!!"); sendBroadcast("通知标题xx","通知内容xxxx"); } logout(connect); try { System.out.println("watting for close.."); Thread.sleep(5000); System.out.println("altready close.."); } catch (InterruptedException e) { e.printStackTrace(); } logout(connect2); } public static XMPPConnection getConnection(String ip,int port,String domain) { System.out.println("getConnection ip=" + ip + ",port="+port+",domain="+domain); ConnectionConfiguration config = new ConnectionConfiguration(ip,port,domain); config.setReconnectionAllowed(true);// 允许自动连接 config.setSendPresence(true);//在线 XMPPConnection connect = new XMPPConnection(config); return connect; } public static ResData rejister(XMPPConnection conn,String uName,String pwd) { Registration reg = new Registration(); reg.setType(IQ.Type.SET); reg.setUsername(uName);// 注意这里createAccount注册时,参数是username,不是jid,是“@”前面的部分。 reg.setPassword(pwd); reg.setInstructions("instruction"); reg.addAttribute("android", "geolo_createUser_android");// 这边addAttribute不能为空,否则出错。所以做个标志是android手机创建的吧!!!!! PacketFilter filter = new AndFilter(new PacketIDFilter( reg.getPacketID()), new PacketTypeFilter(IQ.class)); PacketCollector collector = connect.createPacketCollector(filter); conn.sendPacket(reg); IQ result = (IQ) collector.nextResult(SmackConfiguration .getPacketReplyTimeout()); // Stop queuing results collector.cancel();// 停止请求results(是否成功的结果) ResData res = new ResData(); if (result == null) { System.out.println("err result null!"); } else { res.resCode = result.getType().toString(); if (result.getType() == IQ.Type.ERROR) { res.resDesc = result.getError().toString(); if (res.resDesc.equalsIgnoreCase("conflict(409)")) { System.out.println("err:" + res.resDesc); } } else if (result.getType() == IQ.Type.RESULT) { System.out.println(" result success!"); } } return res; } public static ResData login(XMPPConnection connect,String uName,String pwd) { ResData res = new ResData(); // 登录 try { connect.login(uName, pwd,"res_"+uName); connect.sendPacket(new Presence(Presence.Type.available)); System.out.println("login user:"+connect.getUser()); } catch (XMPPException e) { e.printStackTrace(); } return res; } public static ResData logout(XMPPConnection connect) { ResData res = new ResData(); // 退出 System.out.println("logout user:"+connect.getUser()); Presence presence = new Presence(Presence.Type.unavailable); //这里如果改成unavailable则会显示用户不在线 connect.disconnect(presence); return res; } public static ResData updateStatus(XMPPConnection connect,String status) { ResData res = new ResData(); //更改用户状态代码: Presence presence = new Presence(Presence.Type.available); //这里如果改成unavailable则会显示用户不在线 presence.setStatus("Go fishing"); connect.sendPacket(presence); connect.getRoster(); System.out.println("updateStatus over!"); return res; } /** * TODO FIXME! 为实现功能!!!! * @param subject * @param msg * @return */ public static ResData sendBroadcast(String subject,String msg) { ResData res = new ResData(); XMPPConnection con = getConnection(ip,port,domain); try { con.connect(); con.login("admin", "openfire452196738","SmackTest3"); } catch (XMPPException e) { e.printStackTrace(); } Message newmsg = new Message(); newmsg.setTo(name1+"@"+domain); newmsg.setSubject(subject); newmsg.setBody(msg); newmsg.setType(Message.Type.headline);// normal支持离线 con.sendPacket(newmsg); System.out.println("sendBroadcast over!"); con.disconnect(); return res; } /** * 发送消息 * @param con 用户连接对象 * @param user 用户JID * @param msg 发送内容 */ public static synchronized void sendMessages(XMPPConnection con, String user, String msg) { if (null != user && !"@".equals(user)) { user = user + "@" + con.getServiceName(); } Chat chat = con.getChatManager().createChat(user, null); try { chat.sendMessage(msg); } catch (XMPPException e) { e.printStackTrace(); } } }
package com.ccdt.test1; import org.jivesoftware.smack.AccountManager; import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.ChatManager; import org.jivesoftware.smack.ChatManagerListener; import org.jivesoftware.smack.Connection; import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.MessageListener; import org.jivesoftware.smack.PacketCollector; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.SmackConfiguration; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.AndFilter; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.filter.PacketIDFilter; import org.jivesoftware.smack.filter.PacketTypeFilter; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Registration; public class XmppTest { static private XMPPConnection connect; static private XMPPConnection connect2; static private AccountManager accountManager; private static class ResData { @SuppressWarnings("unused") public String resCode = ""; @SuppressWarnings("unused") public String resDesc = ""; } /** * @param args */ public static void main(String[] args) { String ip = "112.74.83.206"; int port = 5222; String domain=ip; String name1 = "stivenjin"; String name2 = "stivenjin002"; String pwd = "123456"; boolean isRegister = false; //1 connect to server SmackConfiguration.setPacketReplyTimeout(15*1000); connect = getConnection(ip,port,domain); System.out.println("get connection = " + connect); if (connect == null) return; try { connect.connect();//开启链接 accountManager = connect.getAccountManager();// 获取账户管理类 } catch (XMPPException e) { e.printStackTrace(); } System.out.println("connection ok!"); //2.rejister if (isRegister) {// 是否先注册 ResData data = rejister(connect,name1,pwd); if (data.resCode.equals(IQ.Type.ERROR.toString())) { System.out.println("rejister err:"+data.resDesc); } } //3.login login(connect,name1,pwd); //================ 收离线消息 =======================// // User2 checks the number of offline messages /*OfflineMessageManager offlineManager = new OfflineMessageManager(connect); java.util.Iterator<OfflineMessageHeader> headers = null; try { System.out.println("Wrong number of offline messages "+ offlineManager.getMessageCount()); // Check the message headers headers = offlineManager.getHeaders(); } catch (XMPPException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println("No message header was found"+headers.hasNext()); List<String> stamps = new ArrayList<String>(); while (headers.hasNext()) { OfflineMessageHeader header = (OfflineMessageHeader) headers.next(); System.out.println("No stamp was found in the message header"+header.getStamp()); stamps.add(header.getStamp()); } System.out.println("Wrong number of headers"+2+ stamps.size()); // Get the offline messages java.util.Iterator<Message> messages = null; try { messages = offlineManager.getMessages(stamps); } catch (XMPPException e1) { e1.printStackTrace(); } System.out.println("No message was found"+ messages.hasNext()); stamps = new ArrayList<String>(); while (messages.hasNext()) { Message message = (Message) messages.next(); System.out.println("@@@@@@@@@@@@@ offline msg = "+message.getBody()); OfflineMessageInfo info = (OfflineMessageInfo) message.getExtension("offline", "http://jabber.org/protocol/offline"); System.out.println("No offline information was included in the offline message"+ info); System.out.println("No stamp was found in the message header"+ info.getNode()); stamps.add(info.getNode()); } Presence presence = new Presence(Presence.Type.available); connect.sendPacket(presence);//上线了 */ ChatManager chatmanager = connect.getChatManager(); chatmanager.addChatListener(new ChatManagerListener() { public void chatCreated(Chat chat, boolean arg1) { chat.addMessageListener(new MessageListener() { public void processMessage(Chat arg0, Message message) { // 若是聊天窗口已存在,将消息转往目前窗口 //若是窗口不存在,开新的窗口并注册 System.out.println("收到消息f:" + message.getFrom()); System.out.println("收到消息t:" + message.getTo()); System.out.println("收到消息c:" + message.getBody()); } }); } }); connect.addPacketListener(new PacketListener() { public void processPacket(Packet packet) { Message message = (Message) packet; System.out.println("收到消息ff:" + message.getFrom()); System.out.println("收到消息tt:" + message.getTo()); System.out.println("收到消息cc:" + message.getBody()); } }, new PacketTypeFilter(Message.class)); //4.chat System.out.println("befor chat.."); boolean t = true; int idx = 0; try { sendBroadcast(ip,port,domain); System.out.println("watting for logout.."); Thread.sleep(1160000); System.out.println("watting for logout.."); } catch (InterruptedException e) { e.printStackTrace(); } logout(connect); try { System.out.println("watting for close.."); Thread.sleep(11115000); System.out.println("altready close.."); } catch (InterruptedException e) { e.printStackTrace(); } } public static XMPPConnection getConnection(String ip,int port,String domain) { System.out.println("getConnection ip=" + ip + ",port="+port+",domain="+domain); ConnectionConfiguration config = new ConnectionConfiguration(ip,port,domain); config.setReconnectionAllowed(true);// 允许自动连接 config.setSendPresence(false);//先不告诉在线,方便取离线消息 XMPPConnection connect = new XMPPConnection(config); return connect; } public static ResData rejister(XMPPConnection conn,String uName,String pwd) { Registration reg = new Registration(); reg.setType(IQ.Type.SET); reg.setUsername(uName);// 注意这里createAccount注册时,参数是username,不是jid,是“@”前面的部分。 reg.setPassword(pwd); reg.setInstructions("instruction"); reg.addAttribute("android", "geolo_createUser_android");// 这边addAttribute不能为空,否则出错。所以做个标志是android手机创建的吧!!!!! PacketFilter filter = new AndFilter(new PacketIDFilter( reg.getPacketID()), new PacketTypeFilter(IQ.class)); PacketCollector collector = connect.createPacketCollector(filter); conn.sendPacket(reg); IQ result = (IQ) collector.nextResult(SmackConfiguration .getPacketReplyTimeout()); // Stop queuing results collector.cancel();// 停止请求results(是否成功的结果) ResData res = new ResData(); if (result == null) { System.out.println("err result null!"); } else { res.resCode = result.getType().toString(); if (result.getType() == IQ.Type.ERROR) { res.resDesc = result.getError().toString(); if (res.resDesc.equalsIgnoreCase("conflict(409)")) { System.out.println("err:" + res.resDesc); } } else if (result.getType() == IQ.Type.RESULT) { System.out.println(" result success!"); } } return res; } public static ResData login(XMPPConnection connect,String uName,String pwd) { ResData res = new ResData(); // 登录 try { connect.login(uName, pwd,"res_"+uName); connect.sendPacket(new Presence(Presence.Type.available)); System.out.println("login user:"+connect.getUser()); } catch (XMPPException e) { e.printStackTrace(); } return res; } public static ResData logout(XMPPConnection connect) { ResData res = new ResData(); // 退出 System.out.println("logout user:"+connect.getUser()); Presence presence = new Presence(Presence.Type.unavailable); //这里如果改成unavailable则会显示用户不在线 connect.disconnect(presence); return res; } public static ResData chat(XMPPConnection connect, String toUserName, String toIpOrDomain, String msg) { ResData res = new ResData(); if (connect != null) try { connect.getChatManager() .createChat(toUserName + "@" + toIpOrDomain, null) .sendMessage(msg); } catch (XMPPException e) { e.printStackTrace(); } return res; } public static ResData updateStatus(XMPPConnection connect,String status) { ResData res = new ResData(); //更改用户状态代码: Presence presence = new Presence(Presence.Type.available); //这里如果改成unavailable则会显示用户不在线 presence.setStatus("Go fishing"); connect.sendPacket(presence); connect.getRoster(); System.out.println("updateStatus over!"); return res; } public static ResData sendBroadcast(String ip,int port,String domain) { ResData res = new ResData(); final ConnectionConfiguration connectionConfig = new ConnectionConfiguration( ip, port, domain); // 允许自动连接 connectionConfig.setReconnectionAllowed(true); connectionConfig.setSendPresence(true); Connection connection = new XMPPConnection(connectionConfig); try { connection.connect();// 开启连接 } catch (XMPPException e) { throw new IllegalStateException(e); } try { connection.login("admin", "openfire452196738","SmackTest3"); } catch (XMPPException e) { e.printStackTrace(); } Message newmsg = new Message(); //newmsg.setTo(""); newmsg.setSubject("重要通知"); newmsg.setBody("今天下午2点60分有会!"); newmsg.setType(Message.Type.headline);// normal支持离线 connection.sendPacket(newmsg); connection.disconnect(); return res; } /** * 发送消息 * * @param con * 用户连接对象 * @param user * 用户JID * @param msg * 发送内容 */ public synchronized void sendMessages(XMPPConnection con, String user, String msg) { if (null != user && !"@".equals(user)) { user = user + "@" + con.getServiceName(); } Chat chat = con.getChatManager().createChat(user, null); try { chat.sendMessage(msg); } catch (XMPPException e) { e.printStackTrace(); } } }