package com.zhsh.client.manager;
import java.util.Collection;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import com.zhsh.util.ConnectionFactry;
/**
* 客户端管理类负责管理与服务器的通信
*
* @author cWX53049
* @version 1.0 (2013-2-27)
*/
public class Manager {
private XMPPConnection conn;
public Manager() {
this.conn = ConnectionFactry.buildConncting();
}
/**
* 登陆
* @param userName
* @param pwd
*/
public boolean login(String userName,String pwd)
{
try {
conn.login(userName, pwd);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 退出
*/
public void logOut(){
conn.disconnect();
}
/**
* 获取联系人
* @return
*/
public Collection<RosterEntry> getConncat()
{
return conn.getRoster().getEntries();
}
/**
* 获取用户组
* @return
*/
public Collection<RosterGroup> getGroup()
{
return conn.getRoster().getGroups();
}
/**
* 注册用户
* @param name
* @param pwd
* @return
*/
public boolean regidster(String name,String pwd){
try {
conn.getAccountManager().createAccount(name, pwd);
return true;
} catch (XMPPException e) {
e.printStackTrace();
}
return false;
}
/**
* 添加群组
* @param groupName
* @return
*/
public boolean addGroup(String groupName)
{
RosterGroup group = conn.getRoster().createGroup(groupName);
return group==null;
}
/**
* 添加用户
* @param entry
* @param group
* @return
*/
public boolean addConncat(RosterEntry entry,RosterGroup group)
{
try {
group.addEntry(entry);
return true;
} catch (XMPPException e) {
e.printStackTrace();
}
return false;
}
/**
* 构建会话
* @param chatTOName
* @param listener
* @return
*/
public Chat createChat(String chatTOName,MessageListener listener) {
return conn.getChatManager().createChat(chatTOName, listener);
}
}
//------------------
package com.zhsh.client.ui;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Calendar;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import com.zhsh.client.manager.Manager;
public class ChatFrame implements MessageListener{
private Manager manager;
private Chat chat;
private String chatTOName;
private String myName;
private Calendar calendar;
private JTextArea reciveJta;
private JTextArea sendJta;
private JButton sendBtn;
private JFrame mainFrm;
public ChatFrame(Manager manager, String chatTOName,String myName) {
this.manager = manager;
this.chatTOName = chatTOName;
this.myName = myName;
this.calendar = Calendar.getInstance();
initUI();
}
private void initUI() {
mainFrm = new JFrame(myName+"Chat with:"+chatTOName);
reciveJta = new JTextArea(9, 18);
sendJta = new JTextArea(5, 18);
sendBtn = new JButton("Send");
JPanel mianPnl = new JPanel();
mianPnl.add(new JScrollPane(reciveJta));
mianPnl.add(new JScrollPane(sendJta));
mianPnl.add(new JScrollPane(sendBtn));
mainFrm.add(mianPnl);
addAction();
}
private void addAction() {
sendBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMsg();
}
});
sendJta.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
sendMsg();
}
}
});
}
/**
* 打开聊天界面
*/
public void show() {
mainFrm.setPreferredSize(new Dimension(230, 350));
mainFrm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
mainFrm.pack();
mainFrm.setLocationByPlatform(true);
mainFrm.setVisible(true);
}
@Override
public void processMessage(Chat chat, Message message) {
calendar.setTimeInMillis(System.currentTimeMillis());
String dt = String.format("%s-%s %s:%s", calendar.get(Calendar.MONTH)+1,calendar.get(Calendar.DAY_OF_MONTH),
calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE));
String from = message.getFrom();
from = from.substring(0,from.indexOf('@'));
reciveJta.append(String.format("%s(%s):%s\n",from,dt,message.getBody()));
}
private void sendMsg() {
String message = sendJta.getText();
if(message.length()>0)
{
if(chat==null)
{
chat = manager.createChat(chatTOName,ChatFrame.this);
}
try {
chat.sendMessage(message);
sendJta.setText("");
} catch (XMPPException e1) {
e1.printStackTrace();
}
}
}
}
//------------------------
package com.zhsh.client.ui;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import com.zhsh.client.manager.Manager;
public class ClientUI {
private JFrame chatFrm;
private JPanel statusPnl;
private JPanel connCatPnl;
private JPanel loginPnl;
private JButton loginBtn;
private JButton cacelBtn;
private JLabel userNameLbl;
private JTextField userNameJtf;
private JLabel userPwdLbl;
private JPasswordField userPwdJpf;
private JTree conncatJtree;
private JPopupMenu menu;
private DefaultTreeModel model;
private Container conPnl;
private Manager manager;
private JMenuItem addJmi;
public ClientUI() {
manager = new Manager();
intiUI();
}
private void intiUI() {
chatFrm = new JFrame("UI");
statusPnl = new JPanel();
connCatPnl = new JPanel(new BorderLayout());
loginPnl = new JPanel();
userNameLbl = new JLabel("名称:");
userNameJtf = new JTextField(15);
userPwdLbl = new JLabel("密码:");
userPwdJpf = new JPasswordField(15);
loginBtn = new JButton("登陆");
cacelBtn = new JButton("取消");
model = new DefaultTreeModel(new DefaultMutableTreeNode("联系人"));
conncatJtree = new ConCatJTree();
conncatJtree.setModel(model);
loginPnl.add(userNameLbl);
loginPnl.add(userNameJtf);
loginPnl.add(userPwdLbl);
loginPnl.add(userPwdJpf);
loginPnl.add(loginBtn);
loginPnl.add(cacelBtn);
JLabel userStatus = new JLabel("状态:在线");
statusPnl.setLayout(new FlowLayout(FlowLayout.LEFT));
statusPnl.add(userStatus);
connCatPnl.add(statusPnl,BorderLayout.NORTH);
connCatPnl.add(conncatJtree,BorderLayout.CENTER);
conPnl = chatFrm.getContentPane();
conPnl.setLayout(new BorderLayout());
conPnl.add(loginPnl);
menu = new JPopupMenu("操作");
addJmi =menu.add(new JMenuItem("添加组"));
addAction();
show();
}
private void show() {
this.chatFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.chatFrm.setLocationByPlatform(true);
this.chatFrm.setPreferredSize(new Dimension(250,500));
this.chatFrm.pack();
this.chatFrm.setVisible(true);
}
private void addAction() {
this.loginBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String name = userNameJtf.getText();
String pwd = new String(userPwdJpf.getPassword());
if(name.length()>0&&pwd.length()>0)
{
if(manager.login(name, pwd))
{
chatFrm.setTitle(name+" 在线");
model.setRoot(createConncatNode());
loginPnl.setVisible(false);
conPnl.add(connCatPnl);
}
}
}
});
this.cacelBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
manager.logOut();
System.exit(0);
}
});
this.addJmi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String name = JOptionPane.showInputDialog("请输入:");
if(name.length()>0)
{
if(manager.addGroup(name)){
createConncatNode();
}
}
}
});
this.conncatJtree.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(SwingUtilities.isRightMouseButton(e))
{
menu.show(conncatJtree, e.getX(), e.getY());
}else if(e.getClickCount()==2)
{
TreePath path = conncatJtree.getSelectionPath();
if(path!=null)
{
DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
if(node.isLeaf())
{
RosterEntry user = (RosterEntry) node.getUserObject();
ChatFrame chf = new ChatFrame(manager,user.getUser(),userNameJtf.getText());
chf.show();
}
}
}
}
});
DefaultTreeCellRenderer cellderer = new DefaultTreeCellRenderer();
cellderer.setLeafIcon(null);
conncatJtree.setCellRenderer(cellderer );
}
private static class ConCatJTree extends JTree{
private static final long serialVersionUID = 1L;
/**
* 重写该方法避免加到树的对象显示依赖与toString()
*/
@Override
public String convertValueToText(Object value, boolean selected,
boolean expanded, boolean leaf, int row, boolean hasFocus) {
if(value instanceof DefaultMutableTreeNode)
{
Object user = ((DefaultMutableTreeNode)value).getUserObject();
if(user instanceof RosterEntry)
{
return ((RosterEntry)user).getName();
}
}
return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus);
}
}
protected TreeNode createConncatNode() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("联系人");
for(RosterGroup gp:manager.getGroup())
{
DefaultMutableTreeNode newChild = new DefaultMutableTreeNode(gp.getName());
root.add(newChild);
for (RosterEntry user : gp.getEntries()) {
newChild.add(new DefaultMutableTreeNode(user));
}
}
return root;
}
public static void main(String[] args) {
new ClientUI();
}
}
//----------
package com.zhsh.util;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
public class ConnectionFactry {
private static final int PORT = 5222;
private static final String HOST = "openfire";
private static volatile XMPPConnection conn;
/**
* 创建连接
* @return
*/
public static XMPPConnection buildConncting() {
if(conn==null)
{
synchronized (ConnectionFactry.class) {
if(conn==null)
{
try {
ConnectionConfiguration cfg = new ConnectionConfiguration(HOST, PORT);
conn = new XMPPConnection(cfg);
conn.connect();
} catch (XMPPException e) {
e.printStackTrace();
}
}
}
}
return conn;
}
public static void main(String[] args) {
System.out.println(buildConncting());
}
}