NIO3

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());
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值