📄 chatmanagerimpl.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 + -