smack(4.1.6)+openfire(4.0.2)的运用实践

来源:互联网 发布:淘宝英文 编辑:程序博客网 时间:2024/06/07 14:33

服务器用的openfire,本篇主要讲smack的使用

openfire和smack的搭建,大家自行搜索吧。

官网:http://www.igniterealtime.org/


界面用的java的Swing。

接下来就是主要的方法了。

当然了,代码不够严谨,主要为了测试使用。

主要实现的方法有。

1.connect();【获取连接】

2.register();【注册】

3.login();【登录】

4.disConnected();【注销】

4.sendMessage()【点对点聊天】;

5.createRoom();【创建房间】

6.findExistRooms();【查找存在的房间】

7.joinRoom();【进入房间】

8.quitRoom();【退出房间】

9.sendgroupMessage();【在房间里面发送信息】



package com;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.InputMethodEvent;import java.awt.event.InputMethodListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.event.AncestorEvent;import javax.swing.event.AncestorListener;import org.apache.commons.logging.Log;import org.jivesoftware.smack.AbstractXMPPConnection;import org.jivesoftware.smack.MessageListener;import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;import org.jivesoftware.smack.PacketCollector;import org.jivesoftware.smack.SmackConfiguration;import org.jivesoftware.smack.SmackException;import org.jivesoftware.smack.SmackException.NoResponseException;import org.jivesoftware.smack.SmackException.NotConnectedException;import org.jivesoftware.smack.XMPPException;import org.jivesoftware.smack.XMPPException.XMPPErrorException;import org.jivesoftware.smack.chat.Chat;import org.jivesoftware.smack.chat.ChatManager;import org.jivesoftware.smack.chat.ChatManagerListener;import org.jivesoftware.smack.chat.ChatMessageListener;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.tcp.XMPPTCPConnection;import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;import org.jivesoftware.smackx.delay.packet.DelayInformation;import org.jivesoftware.smackx.iqregister.AccountManager;import org.jivesoftware.smackx.iqregister.packet.Registration;import org.jivesoftware.smackx.muc.DiscussionHistory;import org.jivesoftware.smackx.muc.HostedRoom;import org.jivesoftware.smackx.muc.MultiUserChat;import org.jivesoftware.smackx.muc.MultiUserChatManager;import org.jivesoftware.smackx.muc.RoomInfo;import org.jivesoftware.smackx.muc.packet.MUCInitialPresence.History;import org.jivesoftware.smackx.xdata.Form;import org.jivesoftware.smackx.xdata.FormField;public class Test extends JFrame{/** *  */private static final long serialVersionUID = 1L;private static AbstractXMPPConnection conn;private static ChatManager chatManager;private String username="未登录";private String password="admin";//private static String username="test01";//private static String password="1234567";private JTextField usernameField=new JTextField(10);private JTextField passwordField=new JTextField(10);private JButton loginBtn=new JButton("登录");private JButton registerBtn=new JButton("注册");private JButton logoutBtn=new JButton("注销");private JTextField receiverName=new JTextField(10);private JTextField message=new JTextField(10);private JButton button=new JButton("发送");private JButton sendGroupBtn=new JButton("群送");private JButton createRoombutton=new JButton("创建房间");private JButton joinRoombutton=new JButton("加入房间");private JTextField roomnameField=new JTextField(10);private JTextField serviceName=new JTextField("conference",10);private JTextArea textArea=new JTextArea(10, 20);public Test() {connect();this.setTitle(username);this.setSize(300, 500);this.setLayout(new FlowLayout());this.add(new JLabel("用户名"));this.add(usernameField);this.add(new JLabel("密码"));this.add(passwordField);this.add(loginBtn);//登录按钮点击事件loginBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {login();}});this.add(registerBtn);//注册按钮点击事件registerBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {registerUser(usernameField.getText(), passwordField.getText(), new HashMap<String, String>());}});this.add(logoutBtn);//注销按钮点击事件logoutBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {disConnented();}});this.add(new JLabel("接收人"));this.add(receiverName);this.add(new JLabel("消息"));this.add(message);this.add(button);//发送按钮点击事件button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {sendMessage(receiverName.getText(), message.getText());}});this.add(sendGroupBtn);//群发按钮点击事件sendGroupBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {sendgroupMessage();}});this.setLocationRelativeTo(null);this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);//关闭窗口事件this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {disConnented();super.windowClosing(e);}});this.add(new JLabel("房间名"));this.add(roomnameField);this.add(new JLabel("serviceName"));this.add(serviceName);this.add(createRoombutton);//创建房间事件createRoombutton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {createRoom();}});this.add(joinRoombutton);joinRoombutton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {joinRoom(roomnameField.getText());}});JButton quitRoomBtn=new JButton("离开房间");this.add(quitRoomBtn);quitRoomBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {quitRoom();}});JButton findAllRoomsBtn=new JButton("搜索所有房间");this.add(findAllRoomsBtn);findAllRoomsBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {findExistRooms();}});textArea.setLineWrap(true);        //激活自动换行功能 textArea.setWrapStyleWord(true);   // 激活断行不断字功能JScrollPane jsp=new JScrollPane(textArea);this.add(jsp);this.setVisible(true);}//获取一个新的连接public void connect(){XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder().setServiceName("127.0.0.1").setHost("127.0.0.1").setPort(5222).setCompressionEnabled(false).setSecurityMode(SecurityMode.disabled).build();conn = new XMPPTCPConnection(config);try {conn.connect();} catch (SmackException | IOException | XMPPException e1) {e1.printStackTrace();}}public void login(){try {this.username=this.usernameField.getText();this.password=this.passwordField.getText();if(conn==null || !conn.isConnected()){connect();}conn.login(username, password);Presence presence = new Presence(Presence.Type.available);   //这里如果改成unavailable则会显示用户不在线presence.setStatus("Go fishing");conn.sendPacket(presence);this.setTitle(username);chatManager = ChatManager.getInstanceFor(conn);textArea.append(username+":connected");textArea.append("\n");//添加消息接受器chatManager.addChatListener(new ChatManagerListener() {@Overridepublic void chatCreated(Chat arg0, boolean arg1) {if (!arg1)arg0.addMessageListener(new ChatMessageListener(){@Overridepublic void processMessage(Chat arg0, Message msg) {textArea.append(msg.getFrom()+":"+msg.getBody());textArea.append("\n");}});}});} catch (SmackException | IOException | XMPPException e) {textArea.append("登陆失败");textArea.append("\n");e.printStackTrace();}}public static void main(String[] args) {new Test();}public void sendMessage(String toUsername,String message){Chat newChat = chatManager.createChat(toUsername,new ChatMessageListener() {@Overridepublic void processMessage(Chat arg0, Message arg1) {textArea.append("已发送:"+arg1+"\n");textArea.append("\n");}});try {newChat.sendMessage(message);}catch (Exception e) {textArea.append("Error Delivering block\n");}};/** * 使用了createOrJoin。 * @param roomName */public void joinRoom(String roomName){try {// Get the MultiUserChatManagerMultiUserChatManager manager = MultiUserChatManager.getInstanceFor(conn);// Create a MultiUserChat using an XMPPConnection for a roomString servicename="";if("".equals(serviceName.getText())){servicename="@127.0.0.1";}else{servicename=roomName+"@"+serviceName.getText()+".127.0.0.1";}MultiUserChat muc = manager.getMultiUserChat(servicename);// User2 joins the new room using a password and specifying// the amount of history to receive. In this example we are requesting the last 5 messages.DiscussionHistory history = new DiscussionHistory();//不设置即接受所有聊天记录//history.setMaxStanzas(5);muc.join(username, "", history, conn.getPacketReplyTimeout());muc.addMessageListener(new MessageListener() {@Overridepublic void processMessage(Message msg) {System.out.println("join");textArea.append(msg.getFrom()+":"+msg.getBody());textArea.append("\n");textArea.append("\n");DelayInformation d=(DelayInformation) msg.getExtension("urn:xmpp:delay");//若是自己发送的消息,那stamp==null}});textArea.append("已经加入聊天室"+roomName);textArea.append("\n");} catch (XMPPErrorException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoResponseException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NotConnectedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void quitRoom(){try {// Get the MultiUserChatManagerMultiUserChatManager manager = MultiUserChatManager.getInstanceFor(conn);String servicename="";if("".equals(serviceName.getText())){servicename="@127.0.0.1";}else{servicename=roomnameField.getText()+"@"+serviceName.getText()+".127.0.0.1";}MultiUserChat muc = manager.getMultiUserChat(servicename);if(muc.isJoined()){muc.leave();textArea.append(muc.getNickname()+"离开"+muc.getRoom());textArea.append("\n");}} catch (NotConnectedException e) {e.printStackTrace();}}/** * * 注册用户信息 * @param user 账号,是用来登陆用的,不是用户昵称 * @param password 账号密码 * @param * attributes 账号其他属性,参考AccountManager.getAccountAttributes()的属性介绍 * @return */public boolean registerUser(String user, String password, Map<String, String> attributes) {if (!conn.isConnected()) {return false;}try {AccountManager.sensitiveOperationOverInsecureConnectionDefault(true);AccountManager.getInstance(conn).createAccount(user, password, attributes);textArea.append("注册成功!\n");return true;} catch (NoResponseException | XMPPErrorException | NotConnectedException e) {textArea.append("注册失败!\n");return false;}}public void disConnented(){if(conn!=null){conn.disconnect();textArea.append("注销成功!");textArea.append("\n");this.setTitle("未登录");}}/** * 创建并加入聊天室 */public void createRoom(){try{// Get the MultiUserChatManagerMultiUserChatManager manager = MultiUserChatManager.getInstanceFor(conn);String servicename="";if("".equals(serviceName.getText())){servicename="roomnameField.getText()+@127.0.0.1";}else{servicename=roomnameField.getText()+"@"+serviceName.getText()+".127.0.0.1";}// Create a MultiUserChat using an XMPPConnection for a roomMultiUserChat muc =  manager.getMultiUserChat(servicename);// Create the roommuc.create(username);// Get the the room's configuration formForm form = muc.getConfigurationForm();// Create a new form to submit based on the original formForm submitForm = form.createAnswerForm();// Add default answers to the form to submitfor (Iterator fields = form.getFields().iterator(); fields.hasNext();) {FormField field = (FormField) fields.next();if (!FormField.Type.hidden.equals(field.getType()) && field.getVariable() != null) {// Sets the default value as the answersubmitForm.setDefaultAnswer(field.getVariable());}}// 设置聊天室是持久聊天室,即将要被保存下来          submitForm.setAnswer("muc#roomconfig_persistentroom", false);          // 房间仅对成员开放          submitForm.setAnswer("muc#roomconfig_membersonly", false);          // 允许占有者邀请其他人          submitForm.setAnswer("muc#roomconfig_allowinvites", true);          // 能够发现占有者真实 JID 的角色          // submitForm.setAnswer("muc#roomconfig_whois", "anyone");          // 登录房间对话          submitForm.setAnswer("muc#roomconfig_enablelogging", true);          // 仅允许注册的昵称登录          submitForm.setAnswer("x-muc#roomconfig_reservednick", false);          // 允许使用者修改昵称          submitForm.setAnswer("x-muc#roomconfig_canchangenick", false);          // 允许用户注册房间          submitForm.setAnswer("x-muc#roomconfig_registration", false);        //房间最大人数,0表示无限制        List<String> maxPeopleList=new ArrayList<>();        maxPeopleList.add("0");        submitForm.setAnswer("muc#roomconfig_maxusers",maxPeopleList);// Send the completed form (with default values) to the server to configure the roommuc.sendConfigurationForm(submitForm);muc.addMessageListener(new MessageListener() {@Overridepublic void processMessage(Message msg) {textArea.append(msg.getFrom()+":"+msg.getBody());textArea.append("\n");textArea.append("\n");DelayInformation d=(DelayInformation) msg.getExtension("urn:xmpp:delay");//若是自己发送的消息,那stamp==nullif(d != null){System.out.println(d.getStamp());}}});textArea.append(roomnameField.getText()+"创建成功!");textArea.append("\n");}catch(Exception e){textArea.append("createRoom.error\n");e.printStackTrace();}}public void findExistRooms(){try {// Get the MultiUserChatManagerMultiUserChatManager manager = MultiUserChatManager.getInstanceFor(conn);// Discover information about the room roomName@conference.myserverString servicename="";if("".equals(serviceName.getText())){servicename="127.0.0.1";}else{servicename=serviceName.getText()+".127.0.0.1";}List<HostedRoom> hostedRooms = manager.getHostedRooms(servicename);for(HostedRoom r:hostedRooms){textArea.append(r.getJid());textArea.append(":");textArea.append(r.getName());textArea.append("\n");textArea.append("\n");}} catch (NoResponseException | XMPPErrorException | NotConnectedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void sendgroupMessage(){try {MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(conn);MultiUserChat muc = manager.getMultiUserChat(roomnameField.getText()+"@"+serviceName.getText()+".127.0.0.1");muc.sendMessage(message.getText());} catch (NotConnectedException e) {e.printStackTrace();}}}


项目下载地址

http://download.csdn.net/detail/ht1456749/9704573

0 0
原创粉丝点击