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

📄 servercenter.java

📁 是个swing 写的好的通信程序,里面有数据库和原码,运行就可以了,希望好好的
💻 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 + -