servicepane.java

来自「一个简单的程序稳操胜券用拖把有稳操胜券」· Java 代码 · 共 967 行 · 第 1/3 页

JAVA
967
字号
				LoginUser loginUser = (LoginUser)message.getObj();
				String inputPassword = loginUser.getPassword();
				int jqnum = loginUser.getJqnum();
				UserDAOByFile userDAO = new UserDAOByFile();
				try {
					User user = userDAO.findById(jqnum);
					JQMessage loginResult = new JQMessage();
					//用户存在
					if(user!=null){
						if(user.getPassword().equals(inputPassword)){
							this.jqnum = jqnum;
							//正确登陆
							//检测用户是否已经登陆,若已登陆,将之前的登陆用户下线。
							if(isHasLoged(jqnum))
								letClientLogout(jqnum, client.getInetAddress().toString());
							//更改用户状态
							//System.out.println("状态:"+loginUser.getState());
							user.setState(loginUser.getState());
							userDAO.update(user);
							//发送用户的好友的状态.
							loginResult.setType(21);
							Vector<FriendUser> friends = new Vector<FriendUser>();
							FriendUser SelfUser = new FriendUser();
							SelfUser.setJqnum(user.getJqnum());
							SelfUser.setNickName(user.getNickname());
							SelfUser.setPhoto(user.getPhoto());
							SelfUser.setSignature(user.getSignature());
							SelfUser.setState(user.getState());
							friends.add(SelfUser);
							Vector<Integer> listFriend = user.getListFriend();
							//System.out.println(listFriend.size());
							for(int i=0;i<listFriend.size();i++){
								Integer friend_jqnum = listFriend.get(i);
								User friend_user = userDAO.findById(friend_jqnum);
								if(friend_user!=null){
									FriendUser friendUser = new FriendUser();
									friendUser.setJqnum(friend_user.getJqnum());
									friendUser.setNickName(friend_user.getNickname());
									friendUser.setPhoto(friend_user.getPhoto());
									friendUser.setSignature(friend_user.getSignature());
									friendUser.setState(friend_user.getState());
									friends.add(friendUser);
								}
							}
							loginResult.setObj(friends);
							//向table中添加该用户
							if(writeToClient(loginResult))
								table.put(user.getJqnum(), this);
							else
								return;
							//通知好友,我上线了
							writeLog(getLog(user, "用户登录"));
							telFriendState(user);
							//检测是否存在好友的留言,发送过去给用户。
							RecordDAOByFile recordDAO = new RecordDAOByFile();
							Vector<Record> v = recordDAO.findLeaveRecord(jqnum);
							try {
								if(v!=null){
									for(Record record:v)
										sendRecordToClient(this, record);
									recordDAO.deleteRecordForAdmin(jqnum);
									//System.out.println(recordDAO.deleteRecordForAdmin(jqnum));
								}
							} catch (RuntimeException e) {
								writeLog(getLog(user, "发送留言给用户时发生错误:"+e.getMessage()));
							}
						}else{
						//密码错误
							loginResult.setType(22);
							loginResult.setObj("错误的登陆密码["+loginUser.getJqnum()+"]");
							writeToClient(loginResult);
							writeLog(getLoginLog(loginUser, "错误的用户["+loginUser.getJqnum()+"]登录密码"));
							closeClient();
						}
					}else{
						//不存在的用户.
						loginResult.setType(22);
						loginResult.setObj("不存在的用户["+loginUser.getJqnum()+"]");
						writeToClient(loginResult);
						writeLog(getLoginLog(loginUser, "不存在的用户["+loginUser.getJqnum()+"]登录"));
						closeClient();
					}
				} catch (ClassNotFoundException e) {
					writeSysLog("错误:"+e.getMessage());
				} catch (FileNotFoundException e) {
					writeSysLog("错误:"+e.getMessage());
				} catch (IOException e) {
					writeSysLog("错误:"+e.getMessage());
				}		
			}else{
				writeSysLog("客户端"+getClientIP()+"发送错误的数据信息到服务端");
				closeClient();
			}
			
			
		}
		/**
		 * 告诉当前用户的好友自己的状态。
		 * @param user 当前用户.
		 * @throws FileNotFoundException 程序运行异常将抛出此异常。
		 * @throws IOException  程序运行异常将抛出此异常。
		 * @throws ClassNotFoundException 程序运行异常将抛出此异常。
		 */
		private void telFriendState(User user) throws FileNotFoundException, IOException, ClassNotFoundException{
			FriendUser meState = new FriendUser();
			meState.setJqnum(user.getJqnum());
			meState.setState(user.getState());
			meState.setNickName(user.getNickname());
			meState.setPhoto(user.getPhoto());
			meState.setSignature(user.getSignature());
			JQMessage friendLogin = new JQMessage();
			friendLogin.setType(25);
			friendLogin.setObj(meState);
			Vector<Integer> listFriend = user.getListFriend();
			//UserDAOByFile userDAO = new UserDAOByFile();
			for(int i=0;i<listFriend.size();i++){
				Integer friend_jqnum = listFriend.get(i);
				/*User friend_user = userDAO.findById(friend_jqnum);
				
				if((state==UserState.ONLINESTATE.getState() || state==UserState.BUSYSTATE.getState() || state==UserState.DEPARTURESTATE.getState()) && isHasLoged(friend_jqnum) && friend_user.getState()!=UserState.OFFLIENSTATE.getState()){
					writeToClient(friendLogin);
				}*/
				if(isHasLoged(friend_jqnum)){
					ClientLink client = table.get(friend_jqnum);
					client.writeToClient(friendLogin);
				}
			}
		}
		
		
		/**
		 * 想客户端发送消息。
		 * @param message JQMessage对象。
		 * @return 返回发送成功否。
		 */
		public boolean writeToClient(JQMessage message){
			
		/*	if(oos!=null){
				try {
					oos.writeObject(message);
					oos.flush();
					return true;
				} catch (IOException e) {
					writeSysLog("向客户端["+client.getLocalAddress().toString()+":"+client.getLocalPort()+"]发送数据失败!");
					return false;
				}
			}else
				return false;*/
			new ClientWrite(this,message).start();
			return true;
			
		}
		
		/**
		 * 根据User的情况和日志内容获得日志对象。
		 * @param user User对象。
		 * @param what 日志内容。
		 * @return 返回日志对象。
		 */
		public Log getLog(User user,String what){
			Log log = new Log();
			log.setUserid(user.getJqnum());
			log.setIp(client.getLocalAddress().toString());
			log.setNickname(user.getNickname());
			log.setTime(new Date());
			log.setUserid(user.getJqnum());
			log.setWhat(what);
			return log;
		}
		
		/**
		 * 根据FriendUser的情况和日志内容获得日志对象。
		 * @param user FriendUser对象。
		 * @param what 日志内容。
		 * @return 返回日志对象。
		 */
		public Log getLog(FriendUser user,String what){
			Log log = new Log();
			log.setUserid(user.getJqnum());
			log.setIp(client.getLocalAddress().toString());
			log.setNickname(user.getNickName());
			log.setTime(new Date());
			log.setUserid(user.getJqnum());
			log.setWhat(what);
			return log;
		}
		
		/**
		 * 根据LoginUser和日志内容返回日志对象。
		 * @param user LoginUser对象。
		 * @param what 日志内容。
		 * @return 返回日志对象。
		 */
		private Log getLoginLog(LoginUser user,String what){
			Log log = new Log();
			log.setNickname("未知用户");
			log.setUserid(user.getJqnum());
			log.setIp(client.getLocalAddress().toString());
			log.setTime(new Date());
			log.setWhat(what);
			return log;
			
		}
		
		/**
		 * 更新用户的状态。
		 * @param jqnum jq号码。
		 * @param state 用户的当前状态。
		 */
		private void updateUserState(int jqnum,int state){
			UserDAOByFile userDAO = new UserDAOByFile();
			User user = userDAO.findById(jqnum);
			if(user!=null){
				try {
				user.setState(state);
				userDAO.update(user);
				} catch (FileNotFoundException e) {
					writeLog(getLog(user, "更改用户状态时发生错误:"+e.getMessage()));
				} catch (IOException e) {
					writeLog(getLog(user, "更改用户状态时发生错误:"+e.getMessage()));
				}
			}
		}
	}
	
	/**
	 * 客户端的输出线程类。
	 * 2008-9-27
	 * @author		达内科技[Tarena Training Group]
	 * @version	1.0
	 * @since		JDK1.6(建议) 
	 */
	private class ClientWrite extends Thread{
		
		private ClientLink clientLink;
		private JQMessage message;
		
		public ClientWrite(ClientLink clientLink,JQMessage message) {
				this.clientLink = clientLink;
				this.message = message;
		}
		
		public void run() {
			if(clientLink.oos!=null){
				try {
					clientLink.oos.writeObject(message);
					clientLink.oos.flush();
				} catch (IOException e) {
					writeSysLog("向客户端"+clientLink.getClientIP()+"发送数据失败!");
				}
			}
		}
	}
	
	/**
	 * 检测jqnum用户是否已经登陆。
	 * @param jqnum
	 * @return 返回用户是否登陆否。
	 */
	private boolean isHasLoged(int jqnum){
		return table.containsKey(jqnum);
	}
	/**
	 * 断开和服务端的连接。
	 * @param jqnum 
	 * @param ip
	 */
	private void letClientLogout(int jqnum,String ip){
		if(isHasLoged(jqnum)){
			ClientLink clientLink = table.get(jqnum);
			JQMessage message = new JQMessage();
			message.setType(23);
			message.setObj("您的账号在别处[IP:"+ip+"]登录,程序将退出!");
			clientLink.writeToClient(message);
			table.remove(jqnum);
			clientLink.closeClient();
		}
	}
	
	/**
	 * 客户端异常发生和服务端断开连接时,清空table中断开的客户端~~,这是绝对的需要处理的。
	 * @param client
	 */
	private void removeClientForException(ClientLink client){
		if(client!=null && table!=null && table.contains(client)){
			Enumeration<Integer> en = table.keys();
			while(en.hasMoreElements()){
				Integer jqnum = en.nextElement();
				if(table.get(jqnum).equals(client) || table.get(jqnum)==client){
					table.remove(jqnum);
					//更改用户状态
					client.updateUserState(jqnum, UserState.OFFLIENSTATE.getState());
					break;
				}
			}
		}
	}
	
	/**
	 * 广播系统消息。
	 * @param msg 消息内容
	 * @return 返回广播成功否。
	 */
	public static boolean broadcast(String msg){
		if(isServiceRun){
			JQMessage message = new JQMessage();
			message.setType(91);
			message.setObj("  系统消息:"+msg+"\n[该消息发布于"+DateDeal.getCurrentTime()+"]");
			Enumeration<ClientLink> en = table.elements();
			while(en.hasMoreElements()){
				en.nextElement().writeToClient(message);
			}
			return true;
		}else{
			JOptionPane.showMessageDialog(null, "系统服务未启动,无法发送广播!");
			return false;
		}
	}
}

	

⌨️ 快捷键说明

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