📄 servercenter.java
字号:
package smoker.server;
import java.io.*;
import java.net.*;
import java.util.*;
import smoker.db.*;
import smoker.tools.*;
public class ServerCenter implements IServerCenter {
private ServerGUI serverGUI;
private IDBCenter iDBCenter;
private Vector<Department> departments;
private Vector<User> onLineUserList;
private HashMap<Integer, Socket> clientNetInfoMap;
private HashMap<Integer, ConnectClientThread> clientsMap;
public ServerCenter() {
iDBCenter = new DBCenter();
departments = iDBCenter.getDepartments();
clientNetInfoMap = new HashMap<Integer, Socket>();
clientsMap = new HashMap<Integer, ConnectClientThread>();
onLineUserList = new Vector<User>();
serverGUI = new ServerGUI(this);
serverGUI.setVisible(true);
}
public static void main(String[] args) {
new ServerCenter();
}
/**
* 在服务器界面上记录每个客户的上线和下线情况。
*/
public void logLoginMsg(Message msg) {
StringBuffer sb = new StringBuffer();
sb.append(MyCalendar.getInstance().myDateTime('[', ']'));
int type = msg.getType();
User user = (User) msg.getData();
if (type == MsgType.TYPE_ONLINE) {
sb.append(user.getNickName() + " 上线了!");
} else {
sb.append(user.getNickName() + " 下线了!");
}
serverGUI.logLoginMsg(sb.toString());
}
/**
* 将客户端发送信息转发到另一个指定的客户端上。
*/
public void chatWith(ChatInfo chatMsg) {
int RecevicerID = chatMsg.getReceiverID();
ChatInfo chatRec = new ChatInfo();
chatRec.setReceiverID(chatMsg.getSenderID());
chatRec.setSenderID(chatMsg.getReceiverID());
chatRec.setDateTime(chatMsg.getDateTime());
chatRec.setMessage(chatMsg.getMessage());
Message message = new Message(MsgType.TYPE_CHAT, chatRec);
ConnectClientThread client = clientsMap.get(new Integer(RecevicerID));
if (client == null) {
return;
}
client.sendMessage(message);
}
public void removeAllClient() {
onLineUserList.removeAllElements();
clientNetInfoMap.clear();
clientsMap.clear();
}
/**
* 将刚上线的新客户端添加到在线用户列表里,并显示到服务器界面上的表格里。
*/
public void addOnLineUserToList(User user) {
onLineUserList.add(user);
String[] userInfo = getClientNetInfo(user);
addOnLineUserToTable(userInfo);
}
/**
* 将客户端的信息转换成一个用户信息数组
*
* @param user
* @return 用户信息数组
*/
private String[] getClientNetInfo(User user) {
String[] userInfo = new String[8];
userInfo[0] = String.valueOf(user.getUserID());
userInfo[1] = user.getLoginID();
userInfo[2] = user.getNickName();
userInfo[3] = user.getName();
userInfo[4] = user.getSex();
userInfo[5] = user.getDepartmentName();
userInfo[6] = ((Socket) clientNetInfoMap.get(user.getUserID()))
.getInetAddress().getHostAddress();
userInfo[7] = String.valueOf(((Socket) clientNetInfoMap.get(user
.getUserID())).getPort());
return userInfo;
}
/**
* 从 在线用户列表、在线客户端套接字列表、在线客户端线程列表 中移除下线用户, 并将下线的用户信息发送给每一个客户端。
*/
public void offLineInfromAboutAllClient(User user) {
logLoginMsg(new Message(MsgType.TYPE_OFFLINE, user));
delUserDataFromTable(user);
onLineUserList.remove(user);
clientNetInfoMap.remove(user.getUserID());
clientsMap.remove(user.getUserID());
InfromAboutAllClient(MsgType.TYPE_OFFLINE, user);
}
/**
* 调用InfromAboutAllClient()方法通知每一个客户端新上线用户的信息。
*/
public void onLineInfromAboutAllClient(User user) {
logLoginMsg(new Message(MsgType.TYPE_ONLINE, user));
InfromAboutAllClient(MsgType.TYPE_ONLINE, user);
}
/**
* 将指定类型的用户信息发送给每一个客户端。
*
* @param msgType
* @param user
*/
private void InfromAboutAllClient(int msgType, User user) {
int size = onLineUserList.size();
Message msg = new Message(msgType, user);
for (int i = 0; i < size; i++) {
User onLineUser = onLineUserList.get(i);
((ConnectClientThread) clientsMap.get(onLineUser.getUserID()))
.sendMessage(msg);
}
}
/**
* 调用本类中的login()方法验证上线用户, 成功则返回该用户的所有信息,将用户信息转化成RadiateData类型的数据,发送出去。
* 失败则返回一个空用户并发送出去。
*/
public void sendLoginUser(ConnectClientThread client, Message message,
int clientId) {
User user = (User) message.getData();
String loginId = user.getLoginID();
int size = onLineUserList.size();
for (int i = 0; i < size; i++) {
String existLoginId = ((User) onLineUserList.get(i)).getLoginID();
if (loginId.equals(existLoginId)) {
client.sendMessage(new Message(MsgType.TYPE_EXIST, null));
return;
}
}
user = login(user);
if (user != null) {
user.setUserID(clientId);
RadiateData sendRD = new RadiateData();
sendRD.setCurrentUser(user);
sendRD.setOnLineUserList(onLineUserList);
sendRD.setDepartmentList(departments);
Message userMsg = new Message(MsgType.TYPE_LOGIN, sendRD);
client.sendMessage(userMsg);
addOnLineUserToList(user);
onLineInfromAboutAllClient(user);
} else {
RadiateData nullRD = new RadiateData();
nullRD.setCurrentUser(null);
nullRD.setOnLineUserList(null);
nullRD.setDepartmentList(null);
client.sendMessage(new Message(MsgType.TYPE_LOGIN, nullRD));
}
}
/**
* 检查列表中的客户端,若发现哪个客户端对象存在但与服务器的连接已关闭,则从相关的列表中移除它。
*/
public void refAllOnLineUser() {
int size = clientNetInfoMap.size();
for (int i = 0; i < size; i++) {
Socket socket = clientNetInfoMap.get(i);
if (socket != null && socket.isClosed() == false) {
try {
onLineUserList.remove(i);
clientNetInfoMap.remove(i);
clientsMap.remove(i);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 添加用户
*
* @param loginID
* @param password
* @param nickName
* @param name
* @param sex
* @param birthday
* @param address
* @param email
* @param phone
* @param dptName
* @param userPhoto
* @param memo
* @return 返回添加情况
*/
public int addUser(User addUser) {
return iDBCenter.addUser(addUser);
}
/**
* 更新用户信息
*
* @param loginID
* @param password
* @param nickName
* @param name
* @param sex
* @param birthday
* @param address
* @param email
* @param phone
* @param dptName
* @param userPhoto
* @param memo
* @return 返回更新情况
*/
public int updateUser(User editUser) {
return iDBCenter.updateUser(editUser);
}
/**
* 删除用户
*
* @param loginID
* @return 返回删除情况
*/
public int delUser(String loginID) {
return iDBCenter.delUser(loginID);
}
/**
* 调用ServerGUI的addOnLineUser()方法, 将用户信息数组添加到表格的Model中。
*/
public void addOnLineUserToTable(String[] userInfo) {
serverGUI.addOnLineUser(userInfo);
}
/**
* 掉用IDBCenter接口中的loginValidate()方法验证用户的合法性。
*/
public User login(User user) {
return iDBCenter.loginValidate(user);
}
/**
* 调用ServerGUI的removeOffLineUser()方法, 从表格中移除下线用户。
*/
public void delUserDataFromTable(User delUser) {
serverGUI.removeOffLineUser(delUser.getUserID());
}
/**
* 添加一条用户信息到在线用户列表中
*
* @param user
*/
public void addNewOnLineUserToList(User user) {
onLineUserList.add(user);
}
/**
* 将连接服务器的客户端添加到保存客户端的HashMap中。 将 与客户端通信的线程 保存到客户端线程的HashMap中。
*/
public void addNewClientToMaps(Socket socket,
ConnectClientThread clientThread, int key) {
clientsMap.put(key, clientThread);
clientNetInfoMap.put(key, socket);
}
/**
* 返回所有的部门信息
*/
public Vector<Department> getDepartments() {
return departments;
}
/**
* 返回当前在线用户列表
*/
public Vector<User> getOnLineUserList() {
return onLineUserList;
}
public void closeAllClient() {
InfromAboutAllClient(MsgType.TYPE_CLOSE, null);
}
public String getHostAddress() {
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return null;
}
public String getHostName() {
try {
return InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return null;
}
public int getServerPort() {
return iDBCenter.getPort();
}
public void setServerPort(String port) {
if (!DataManager.isNumeric(port)) {
Msg.show("端口号应为纯数字!");
return;
} else if (Long.parseLong(port) < 1025 || Long.parseLong(port) > 65535) {
Msg.show("端口号范围应在:1025 - 65535 之间!");
return;
}
iDBCenter.setPort(port);
}
public void coerceOffLine(User user) {
int id = user.getUserID();
clientsMap.get(id).sendMessage(
new Message(MsgType.TYPE_COERCEOFFLINE, null));
}
public int upDateCompany(Company editComInfo) {
return iDBCenter.upDateCompany(editComInfo);
}
public int addDpt(Department addDptInfo) {
return iDBCenter.addDpt(addDptInfo);
}
public int delDpt(String dptName) {
return iDBCenter.delDpt(dptName);
}
public int upDateDpt(Department editDptInfo) {
return iDBCenter.upDateDpt(editDptInfo);
}
public Company getCompayInfo() {
return iDBCenter.getCompayInfo();
}
public User seeUserData(int userId) {
int size = onLineUserList.size();
for (int i = 0; i < size; i++) {
User lookUser = onLineUserList.get(i);
if (lookUser.getUserID() == userId) {
return lookUser;
}
}
return null;
}
public User queryUser(String loginId) {
return iDBCenter.queryUser(loginId);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -