servicepane.java

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

JAVA
967
字号
									break;
								case 30:
									dealMessage(message);
									break;
								case 40:
									dealFindOnlineUserNum();
									break;
								case 42:
									dealFindOnlineUser();
									break;
								case 44:
									dealAddUser(message);
									break;
								}
							}
						}else
							writeSysLog("客户端"+getClientIP()+"发送错误的数据信息到服务端");
					}
				} catch (IOException e) {
					//逻辑的慎密~~这里容易忽略
					removeClientForException(this);
					closeClient();
				} catch (ClassNotFoundException e) {
					removeClientForException(this);
					closeClient();
				}
			}else{
				writeSysLog("注意:系统暂不支持数据库方式!请使用文件方式保存数据!");
				letClientQuit();
			}
		}
		
		/**
		 * 获取客户端IP
		 * @return 返回字符串的IP。
		 */
		private String getClientIP(){
			return client==null?"[客户端已关闭,不能获取信息]":"["+client.getInetAddress().toString()+":"+client.getPort()+"]";
		}
		
		/**
		 * 使得客户端下线。
		 */
		private void letClientQuit(){
			JQMessage message = new JQMessage();
			message.setType(90);
			message.setObj("和服务端断开连接");
			writeToClient(message);
			closeClient();
		}
		
		/**
		 * 关闭和客户端的连接
		 */
		private void closeClient(){
			String ip = getClientIP();
			writeSysLog(DateDeal.getCurrentTime()+",客户端"+getClientIP()+"下线.");
			try {
				if(oos!=null)oos.close();oos = null;
				if(ois!=null)ois.close();ois = null;
				if(client!=null)client.close();client=null;
			} catch (IOException e) {
				writeSysLog(DateDeal.getCurrentTime()+",关闭到客户端"+ip+"的连接时时发生错误:"+e.getMessage());
			}
		}
		
		/**
		 * 处理客户端退出消息。
		 * @param message JQMessage对象。
		 */
		private void dealQuit(JQMessage message){
			Object obj = message.getObj();
			if(obj instanceof FriendUser){
				FriendUser user = (FriendUser)obj;
				writeLog(getLog(user, "用户退出"));
			}
			updateUserState(jqnum, UserState.OFFLIENSTATE.getState());
			UserDAOByFile userDAO = new UserDAOByFile();
			try {
				telFriendState(userDAO.findById(jqnum));
			} catch (FileNotFoundException e) {
			} catch (IOException e) {
			} catch (ClassNotFoundException e) {}
			table.remove(jqnum);
			closeClient();
		}
		
		/**
		 * 处理注册新用户。
		 * @param message JQMessage对象。
		 */
		private void dealAddUser(JQMessage message){
			if(message.getObj() instanceof Integer){
				int jqnum = (Integer)message.getObj();
				JQMessage message2 = new JQMessage();
				boolean b = eachAddFriend(jqnum);
				if(b){
					message2.setType(45);
					message2.setObj("恭喜好友添加成功!");
				}else{
					message2.setType(46);
					message2.setObj("抱歉好友添加失败!");
				}
				writeToClient(message2);
				UserDAOByFile userDAO = new UserDAOByFile();
				User user = userDAO.findById(jqnum);
				User self = userDAO.findById(this.jqnum);
				if(user!=null)
					telfriendOnline(this.jqnum, user);
				if(self!=null)
					telfriendOnline(jqnum, self);
			}
		}
		
		/**
		 * 告诉好友我的状态。
		 * @param jqnum jq号码。
		 * @param user User对象。
		 */
		private void telfriendOnline(int jqnum,User user){
			if(isHasLoged(jqnum)){
				JQMessage message = new JQMessage();
				FriendUser friendUser = new FriendUser();
				friendUser.setJqnum(user.getJqnum());
				friendUser.setNickName(user.getNickname());
				friendUser.setPhoto(user.getPhoto());
				friendUser.setSignature(user.getSignature());
				friendUser.setState(user.getState());
				message.setType(25);
				message.setObj(friendUser);
				table.get(jqnum).writeToClient(message);
			}
		}
		
		/**
		 * 相互添加好友。
		 * @param jqnum jq号码。
		 * @return 然会添加成功否。
		 */
		private boolean eachAddFriend(int jqnum){
			UserDAOByFile userDAO = new UserDAOByFile();
			User user = userDAO.findById(jqnum);
			User self = userDAO.findById(this.jqnum);
			if(user!=null && self!=null){
				Vector<Integer> v = user.getListFriend();
				//好友不存在好友列表的情况下再添加
				if(!v.contains(this.jqnum)){
					v.add(this.jqnum);
					user.setListFriend(v);
					writeLog(getLog(user, " 用户["+user.getNickname()+"("+user.getJqnum()+")]添加好友["+self.getNickname()+"("+self.getJqnum()+")]"));
					
					try {
						userDAO.update(user);
					} catch (FileNotFoundException e) {
						writeLog(getLog(user, " 用户["+user.getNickname()+"("+user.getJqnum()+")]添加好友["+self.getNickname()+"("+self.getJqnum()+")]时发生错误:"+e.getMessage()));
						return false;
					} catch (IOException e) {
						writeLog(getLog(user, " 用户["+user.getNickname()+"("+user.getJqnum()+")]添加好友["+self.getNickname()+"("+self.getJqnum()+")]时发生错误:"+e.getMessage()));
						return false;
					}
				}
				Vector<Integer> v2 = self.getListFriend();
				if(!v2.contains(jqnum)){
					v2.add(jqnum);
					self.setListFriend(v2);
					writeLog(getLog(user, " 用户["+self.getNickname()+"("+self.getJqnum()+")]添加好友["+user.getNickname()+"("+user.getJqnum()+")]"));
					try {
						userDAO.update(self);
					} catch (FileNotFoundException e) {
						v.remove(this.jqnum);
						user.setListFriend(v);
						try {
							userDAO.update(user);
						} catch (FileNotFoundException e1) {} catch (IOException e1) {}
						writeLog(getLog(self, " 用户["+self.getNickname()+"("+self.getJqnum()+")]添加好友["+user.getNickname()+"("+user.getJqnum()+")]时发生错误:"+e.getMessage()));
						return false;
					} catch (IOException e) {
						v.remove(this.jqnum);
						user.setListFriend(v);
						try {
							userDAO.update(user);
						} catch (FileNotFoundException e1) {} catch (IOException e1) {}
						writeLog(getLog(self, " 用户["+self.getNickname()+"("+self.getJqnum()+")]添加好友["+user.getNickname()+"("+user.getJqnum()+")]时发生错误:"+e.getMessage()));
						return false;
					}
				}
				return true;
			}else
				return false;
		}
		
		/**
		 * 传输当前的在线用户FriendUser。
		 */
		private void dealFindOnlineUser(){
			UserDAOByFile userDAO = new UserDAOByFile();
			Enumeration<Integer> en = table.keys();
			while(en.hasMoreElements()){
				int jqnum = en.nextElement();
				if(jqnum!=this.jqnum){
					User user = userDAO.findById(jqnum);
					if(user!=null && !user.getListFriend().contains(this.jqnum)){
						FriendUser friendUser = new FriendUser();
						friendUser.setJqnum(jqnum);
						friendUser.setPhoto(user.getPhoto());
						friendUser.setNickName(user.getNickname());
						friendUser.setSignature(user.getSignature());
						friendUser.setState(user.getState());
						JQMessage message = new JQMessage();
						message.setType(43);
						message.setObj(friendUser);
						writeToClient(message);
					}
				}
			}
		}
		
		/**
		 * 传输当前在线用户数。
		 */
		private void dealFindOnlineUserNum(){
			JQMessage message = new JQMessage();
			message.setType(41);
			message.setObj(table.size());
			writeToClient(message);
		}
		
		/**
		 * 处理客户端发送过来的消息。
		 * @param message 发送过来的消息。
		 * @throws FileNotFoundException 发送给好友失败时抛出此异常。
		 * @throws IOException 发送给好友失败是抛出此异常。
		 */
		private void dealMessage(JQMessage message) throws FileNotFoundException, IOException{
			if(message.getObj() instanceof Record){
				Record record = (Record)message.getObj();
				record.setSendTime(new Date());
				int jqnum = record.getToid();
				//发送消息的好友是否检测在线
				//System.out.println("新消息"+record);
				if(isHasLoged(jqnum)){
					ClientLink client = table.get(jqnum);
					sendRecordToClient(client, record);
				}else{
					record.setRead(false);
					record.setReadTime(new Date());
					record.setSendTime(new Date());
					RecordDAOByFile recordDAO = new RecordDAOByFile();
					recordDAO.addRecordForAdmin(record);
				}
			}else
				writeSysLog("客户端"+getClientIP()+"发送错误的数据信息["+message.getObj()+"]到服务端");
		}
		
		/**
		 * 发送消息到客户端。
		 * @param client 发送的目标Socket
		 * @param record 发送的记录
		 * @throws FileNotFoundException 发送失败抛出此异常
		 * @throws IOException 发送失败抛出此异常
		 */
		private void sendRecordToClient(ClientLink client,Record record) throws FileNotFoundException, IOException{
			JQMessage message = new JQMessage();
			message.setType(31);
			message.setObj(record);
			if(client.writeToClient(message)){
				record.setRead(true);
				record.setReadTime(new Date());
			}else{
				record.setRead(false);
				RecordDAOByFile recordDAO = new RecordDAOByFile();
				recordDAO.addRecordForAdmin(record);
			}
		}
		
		/**
		 * 处理注册用户。
		 * @param message JQMessage对象。
		 * @throws FileNotFoundException
		 * @throws IOException
		 */
		private void dealRegiter(JQMessage message) throws FileNotFoundException, IOException{
			if(message.getObj() instanceof User){
				User user = (User)message.getObj();
				JQCreater creater = new JQCreater();
				int id = creater.createID();
				int num = creater.createJQ();
				creater.saveIDJQ(id, num);
				user.setId(id);
				user.setJqnum(num);
				user.setRegisterTime(new Date());
				UserDAOByFile userDAO = new UserDAOByFile();
				boolean b =userDAO.add(user);
				eachAddFriend(JQServer.manager);
				JQMessage regResult = new JQMessage();
				if(b){
					regResult.setType(11);
					RegUser regUser = new RegUser();
					regUser.setJqnum(user.getJqnum());
					regUser.setNickname(user.getNickname());
					regUser.setRealname(user.getRealname());
					regUser.setPassword(user.getPassword());
					regResult.setObj(regUser);
					writeLog(getLog(user,"新用户注册成功!"));
				}else{
					regResult.setType(12);
					regResult.setObj(null);
					writeLog(getLog(user,"用户注册失败!"));
				}
				writeToClient(regResult);
			}else{
				writeSysLog("客户端"+getClientIP()+"发送错误的数据信息到服务端");
			}
			//closeClient();
		}
		
		/**
		 * 处理用户登陆。
		 * @param message JQMessage对象。
		 */
		private void DealLogin(JQMessage message){
			//用户登陆
			if(message.getObj() instanceof LoginUser){

⌨️ 快捷键说明

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