⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatmanagerimpl.java

📁 This is the simple Chat application use RMI
💻 JAVA
字号:
package chat.share;

import java.rmi.*;
import java.rmi.server.*;
import java.util.*;

public class ChatManagerImpl extends UnicastRemoteObject implements ChatManager {

	// 儐乕僓曐懚曄悢
	private transient Hashtable userMap = new Hashtable();


	/**
	 * 昁梫
	 */
	public ChatManagerImpl() throws RemoteException {
		super();

		init();
	}

	/**
	 * 僒乕僶弶婜壔張棟
	 *
	 */
	private void init() {
		PingThread pingThread = new PingThread();
		pingThread.start();
	}

	/**
	 * 儐乕僓儘僌僆儞儊僜僢僪
	 *
	 */
	public String logon(String userName, ChatNotify chatNotify) throws RemoteException {

		try {
			if (userMap.containsKey(userName)) {
				return MessageCode.ERROR_002;
			} else {
				userMap.put(userName, chatNotify);
			}

			processLogonMessage(userName);

			processUserRefresh();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return MessageCode.OK;
	}


	/**
	 * 儐乕僓儘僌僆僼儊僜僢僪
	 *
	 */
	public String logoff(String userName) throws RemoteException {
		try {
			if (!userMap.containsKey(userName)) {
				return MessageCode.ERROR_003;
			} else {
				userMap.remove(userName);
			}

			processLogoffMessage(userName);

			processUserRefresh();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return MessageCode.OK;
	}


	/**
	 * 嫟捠儊僢僙乕僕張棟
	 *
	 */
	public String processMessage(String message) throws RemoteException {
		String sUser = null;
		ChatNotify chatNotify = null;

		try {
			Enumeration sKeys = userMap.keys();
			while (sKeys.hasMoreElements()) {
				sUser = (String) sKeys.nextElement();
				chatNotify = (ChatNotify) userMap.get(sUser);

				(new NotifyThread(sUser, chatNotify, message)).start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return MessageCode.OK;
	}


	/**
	 * 儊僢僙乕僕張棟
	 *
	 */
	public String processChatMessage(String userName, String message) throws RemoteException {

		processMessage(userName + "> " + message);

		return MessageCode.OK;
	}


	/**
	 * 儘僌僆儞儊僢僙乕僕張棟
	 *
	 */
	public void processLogonMessage(String userName) throws RemoteException {
		processMessage(userName + MessageCode.MSG_001);
	}


	/**
	 * 儘僌僆僼儊僢僙乕僕張棟
	 *
	 */
	public void processLogoffMessage(String userName) throws RemoteException {
		processMessage(userName + MessageCode.MSG_002);
	}


	/**
	 * 儐乕僓儕僗僩Refresh
	 *
	 */
	private void processUserRefresh() throws RemoteException {
		ChatNotify chatNotify = null;
		String sUser = null;

		Enumeration userKeys = userMap.keys();
		Vector users = new Vector();

		// 儐乕僓儕僗僩惗惉
		while (userKeys.hasMoreElements()) {
			sUser = (String) userKeys.nextElement();
			users.add(sUser);
		}

		try {
			Enumeration sKeys = userMap.keys();
			while (sKeys.hasMoreElements()) {
				sUser = (String) sKeys.nextElement();
				chatNotify = (ChatNotify) userMap.get(sUser);

				chatNotify.refreshUserList(users);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


	/**
	 * MultiThread張棟
	 */
	class NotifyThread extends Thread {
		String message = null;;
		String userName = null;
		ChatNotify chatNotify;

		public NotifyThread(String userName, ChatNotify chatNotify, String message) {
			this.userName = userName;
			this.chatNotify = chatNotify;
			this.message = message;
		}

		public void run() {
			try {
				chatNotify.notifyMessage(message);
			} catch (ConnectException ce) {
				try {
					logoff(userName);
				} catch (Exception e) {
					e.printStackTrace();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}


	/**
	 * 僋儔僀儞ping MultiThread張棟
	 */
	class PingThread extends Thread {
		public void run() {
			while (true) {
				try {
					Thread.sleep(10000);

					Enumeration sKeys = userMap.keys();
					while (sKeys.hasMoreElements()) {
						String sUser = (String) sKeys.nextElement();
						ChatNotify chatNotify = (ChatNotify) userMap.get(sUser);
						try {
							chatNotify.pingUser();
						} catch (ConnectException ce) {
							try {
								logoff(sUser);
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -