package com.cvicse.test; /** * @author jgao1 * Bytes类用来处理字符串 */ public class Bytes { public static String substring(String src, int start_idx, int end_idx) { byte[] b = src.getBytes(); String tgt = ""; for (int i = start_idx; i <= end_idx; i++) { tgt += (char) b[i]; } return tgt; } } package com.cvicse.test; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class CountDate { private String currentMonth; private String nextMonth; private String currentYear; private String nextYear; private String currentYM; private String currentYMDHMS; private Date currentYMDHMSs; private String nextYMDHMS; /* 根据系统日期获得当月 */ public String getCurrentMonth() { Calendar rightNow = Calendar.getInstance(); if (String.valueOf(rightNow.get(Calendar.MONTH) + 1).length() > 1) { this.currentMonth = String .valueOf(rightNow.get(Calendar.MONTH) + 1); return currentMonth; } this.currentMonth = "0" + String.valueOf(rightNow.get(Calendar.MONTH) + 1); return currentMonth; } /* 根据系统日期获得当年 */ public String getCurrentYear() { Calendar rightNow = Calendar.getInstance(); this.currentYear = String.valueOf(rightNow.get(Calendar.YEAR)); return currentYear; } /* 根据系统日期获得数据库日期 */ public String getCurrentYMDHMS() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Timestamp t = new Timestamp(Calendar.getInstance().getTimeInMillis()); this.currentYMDHMS = sdf.format(t); return currentYMDHMS; } public Date getCurrentYMDHMSs() { Timestamp t = new Timestamp(Calendar.getInstance().getTimeInMillis()); currentYMDHMSs = t; return currentYMDHMSs; } /* 根据系统日期获得下个月 */ public String getNextMonth() { Calendar rightNow = Calendar.getInstance(); if ((rightNow.get(Calendar.MONTH) + 1) == 12) { this.nextMonth = "01"; this.nextYear = String.valueOf(rightNow.get(Calendar.YEAR) + 1); return nextMonth; } if (String.valueOf(rightNow.get(Calendar.MONTH) + 2).length() > 1) { this.nextMonth = String.valueOf(rightNow.get(Calendar.MONTH) + 2); return nextMonth; } this.nextMonth = "0" + String.valueOf(rightNow.get(Calendar.MONTH) + 2); return nextMonth; } /* 根据系统日期获得下个月的年分 */ public String getNextYear() { Calendar rightNow = Calendar.getInstance(); if ((rightNow.get(Calendar.MONTH) + 1) == 12) { this.nextMonth = "01"; this.nextYear = String.valueOf(rightNow.get(Calendar.YEAR) + 1); return nextYear; } this.nextYear = String.valueOf(rightNow.get(Calendar.YEAR)); return nextYear; } /* 根据系统日期获得下个月的数据库日期 */ public String getNextYMDHMS() { nextYear = getNextYear(); nextMonth = getNextMonth(); this.nextYMDHMS = nextYear + "-" + nextMonth + "-" + "01 00:00:00"; return nextYMDHMS; } /* 根据给定的月参数获得当月日期 */ public String getCurrentMonth(int pcurrentMonth) { if (pcurrentMonth % 12 > 1 || (pcurrentMonth % 12 == 1)) { if (String.valueOf((pcurrentMonth % 12)).length() > 1) { this.currentMonth = String.valueOf((pcurrentMonth % 12)); } else { this.currentMonth = "0" + String.valueOf((pcurrentMonth % 12)); return currentMonth; } } if (String.valueOf(pcurrentMonth).length() > 1) { this.currentMonth = String.valueOf(pcurrentMonth); } else { this.currentMonth = "0" + String.valueOf(pcurrentMonth); } return currentMonth; } /* 根据给定的月参数和年参数获得当年 */ public String getCurrentYear(int pcurrentMonth, int pcurrentYear) { if (pcurrentMonth % 12 > 1 || (pcurrentMonth % 12 == 1)) { if (String.valueOf((pcurrentMonth % 12)).length() > 1) { this.currentMonth = String.valueOf((pcurrentMonth % 12)); } else { this.currentMonth = "0" + String.valueOf((pcurrentMonth % 12)); } this.currentYear = String .valueOf(pcurrentMonth / 12 + pcurrentYear); return currentYear; } return this.currentYear = String.valueOf(pcurrentYear); } /* 根据给定的月参数和年参数获得数据库日期 */ public String getCurrentYMDHMS(int pcurrentMonth, int pcurrentYear) { if ((pcurrentMonth % 12 > 1) || (pcurrentMonth % 12 == 1)) { if (String.valueOf((pcurrentMonth % 12)).length() > 1) { this.currentMonth = String.valueOf((pcurrentMonth % 12)); } else { this.currentMonth = "0" + String.valueOf((pcurrentMonth % 12)); } this.currentYear = String .valueOf(pcurrentMonth / 12 + pcurrentYear); this.currentYMDHMS = currentYear + "-" + currentMonth + "-" + "01 00:00:00"; return currentYMDHMS; } if (String.valueOf(pcurrentMonth).length() > 1) { this.currentMonth = String.valueOf(pcurrentMonth); } else { this.currentMonth = "0" + String.valueOf(pcurrentMonth); } this.currentYear = String.valueOf(pcurrentYear); this.currentYMDHMS = currentYear + "-" + currentMonth + "-" + "01 00:00:00"; return currentYMDHMS; } public Date getCurrentYMDHMSs(int pcurrentMonth, int pcurrentYear) { if (pcurrentMonth % 12 > 1 || (pcurrentMonth % 12 == 1)) { if (String.valueOf((pcurrentMonth % 12)).length() > 1) { this.currentMonth = String.valueOf((pcurrentMonth % 12)); } else { this.currentMonth = "0" + String.valueOf((pcurrentMonth % 12)); } this.currentYear = String .valueOf(pcurrentMonth / 12 + pcurrentYear); this.currentYMDHMSs = Timestamp.valueOf(currentYear + "-" + currentMonth + "-" + "01 00:00:00.0"); return currentYMDHMSs; } if (String.valueOf(pcurrentMonth).length() > 1) { this.currentMonth = String.valueOf(pcurrentMonth); } else { this.currentMonth = "0" + String.valueOf(pcurrentMonth); } this.currentYear = String.valueOf(pcurrentYear); this.currentYMDHMSs = Timestamp.valueOf(currentYear + "-" + currentMonth + "-" + "01 00:00:00.0"); return currentYMDHMSs; } /* 根据给定的月参数和年参数获得下个月的月份和年份 */ public String getNextYMDHMS(int pcurrentMonth, int pcurrentYear) { if ((pcurrentMonth % 12 > 1) || (pcurrentMonth % 12 == 1)) { if (String.valueOf((pcurrentMonth % 12)).length() > 1) { this.currentMonth = String.valueOf((pcurrentMonth % 12)); } else { this.currentMonth = "0" + String.valueOf((pcurrentMonth % 12)); } this.currentYear = String .valueOf(pcurrentMonth / 12 + pcurrentYear); if (String.valueOf(Integer.parseInt(currentMonth) + 1).length() > 1) { this.nextMonth = String .valueOf(Integer.parseInt(currentMonth) + 1); } else { this.nextMonth = "0" + String.valueOf(Integer.parseInt(currentMonth) + 1); } this.nextYear = currentYear; this.nextYMDHMS = nextYear + "-" + nextMonth + "-" + "01 00:00:00"; return nextYMDHMS; } if (pcurrentMonth == 12) { this.nextMonth = "01"; this.nextYear = String.valueOf(pcurrentYear + 1); this.nextYMDHMS = nextYear + "-" + nextMonth + "-" + "01 00:00:00"; return nextYMDHMS; } if (String.valueOf(pcurrentMonth + 1).length() > 1) { this.nextMonth = String.valueOf(pcurrentMonth + 1); this.nextYear = String.valueOf(pcurrentYear); this.nextYMDHMS = nextYear + "-" + nextMonth + "-" + "01 00:00:00"; return nextYMDHMS; } this.nextMonth = "0" + String.valueOf(pcurrentMonth + 1); this.nextYear = String.valueOf(pcurrentYear); this.nextYMDHMS = nextYear + "-" + nextMonth + "-" + "01 00:00:00"; return nextYMDHMS; } /* 根据系统日期获得下个月的年份和月份 */ public String getCurrentYM() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月"); Timestamp t = new Timestamp(Calendar.getInstance().getTimeInMillis()); this.currentYM = sdf.format(t); return currentYM; } /* 根据系统日期获得当月的年份和月份 */ public String getCurrentYM(int pcurrentMonth, int pcurrentYear) { if (pcurrentMonth % 12 > 1 || (pcurrentMonth % 12 == 1)) { if (String.valueOf(pcurrentMonth % 12).length() > 1) { this.currentMonth = String.valueOf((pcurrentMonth % 12)); } else { this.currentMonth = "0" + String.valueOf((pcurrentMonth % 12)); } this.currentYear = String .valueOf(pcurrentMonth / 12 + pcurrentYear); this.currentYM = currentYear + "年" + currentMonth + "月"; return currentYM; } if (String.valueOf(pcurrentMonth).length() > 1) { this.currentMonth = String.valueOf(pcurrentMonth); } else { this.currentMonth = "0" + String.valueOf(pcurrentMonth); } this.currentYear = String.valueOf(pcurrentYear); this.currentYM = currentYear + "年" + currentMonth + "月"; return currentYM; } public static void main(String args[]) { CountDate c = new CountDate(); System.out.println(c.getCurrentYMDHMSs(12, 2029)); } } package com.cvicse.test; import java.sql.Timestamp; public class MonitorInfoBean implements Comparable<MonitorInfoBean> { /** 操作系统. */ private String osName; /** 总的物理内存. */ private float totalMemorySize; /** 已使用的物理内存. */ private float usedMemory; /** cpu使用率. */ private double cpuRatio; /** 主机IP地址 */ private String mIpAddress; /** 数据存储时间 */ private String dDateTime; /** 内存使用率 */ private float memoryRatio; /** linux下Buffers内存 */ private float buffersMemory; /** linux下Cached内存 */ private float cachedMemory; public float getBuffersMemory() { return buffersMemory; } public float getCachedMemory() { return cachedMemory; } public String getDDateTime() { return dDateTime; } public void setDDateTime(String dateTime) { dDateTime = dateTime; } public String getMIpAddress() { return mIpAddress; } public void setMIpAddress(String ipAddress) { mIpAddress = ipAddress; } public String getOsName() { return osName; } public void setOsName(String osName) { this.osName = osName; } public float getTotalMemorySize() { return totalMemorySize; } public void setTotalMemorySize(float totalMemorySize) { this.totalMemorySize = totalMemorySize; } public float getUsedMemory() { return usedMemory; } public void setUsedMemory(long usedMemory) { this.usedMemory = usedMemory; } public double getCpuRatio() { return cpuRatio; } public void setCpuRatio(double cpuRatio) { this.cpuRatio = cpuRatio; } public int compareTo(MonitorInfoBean m) { String stra = this.getDDateTime(); String strb = m.getDDateTime(); Timestamp a = Timestamp.valueOf(stra); Timestamp b = Timestamp.valueOf(strb); if (a.before(b)) { return -1; } else if (a.after(b)) { return 1; } else { return 0; } } public float getMemoryRatio() { return memoryRatio; } public void setMemoryRatio(float memoryRatio) { this.memoryRatio = memoryRatio; } public void setUsedMemory(float usedMemory) { this.usedMemory = usedMemory; } public void setBuffersMemory(float buffersMemory) { this.buffersMemory = buffersMemory; } public void setCachedMemory(float cachedMemory) { this.cachedMemory = cachedMemory; } } package com.cvicse.test; public interface IMonitorService { public MonitorInfoBean getMonitorInfoBean() throws Exception; } package com.cvicse.test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; import java.util.StringTokenizer; import com.sun.management.OperatingSystemMXBean; import sun.management.ManagementFactory; public class MonitorServiceImpl implements IMonitorService { private static final int CPUTIME = 30; private static final int PERCENT = 100; private static final int FAULTLENGTH = 10; private static String osVersion = null; private String mIpAddress = null; private String dDateTime = null; private float totalMemorySize = 0.0f; private float buffersMemory = 0.0f; private float cachedMemory = 0.0f; private float usedMemory = 0.0f; private float memoryRatio; /** * 获得当前的监控对象. * * @return 返回构造好的监控对象 * @throws Exception * @author YINLIANG */ public MonitorInfoBean getMonitorInfoBean() throws Exception { int kb = 1024; CountDate ddate = new CountDate(); osVersion = System.getProperty("os.version"); OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory .getOperatingSystemMXBean(); // 操作系统 String osName = System.getProperty("os.name"); // 主机IP if (osName.toLowerCase().startsWith("windows")) { mIpAddress = this.getWindowsIp(); } else { mIpAddress = this.getLinuxIP(); } if (osName.toLowerCase().startsWith("windows")) { // 总的物理内存 float totalPhysicalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb; float usedPhysicalMemorySize = (osmxb.getTotalPhysicalMemorySize() - osmxb .getFreePhysicalMemorySize()) / kb; totalMemorySize = Float.parseFloat(String.format("%.1f", totalPhysicalMemorySize)); // 已使用的物理内存 usedMemory = Float.parseFloat(String.format("%.1f", usedPhysicalMemorySize)); // windows内存使用率 memoryRatio = Float.parseFloat(String.format("%.1f", (usedMemory / totalMemorySize) * 100)); } else { float[] result = null; result = getLinuxMemInfo(); totalMemorySize = Float .parseFloat(String.format("%.1f", result[0])); buffersMemory = Float.parseFloat(String.format("%.1f", result[1])); cachedMemory = Float.parseFloat(String.format("%.1f", result[2])); usedMemory = totalMemorySize - result[3]; // linux内存使用率 memoryRatio = Float .parseFloat(String .format( "%.1f", ((usedMemory - (cachedMemory + buffersMemory)) / totalMemorySize) * 100)); } // 获得cpu频率 double cpuRatio = 0; if (osName.toLowerCase().startsWith("windows")) { cpuRatio = this.getCpuRatioForWindows(); } else { cpuRatio = this.getCpuRateForLinux(); } /* 取得数据时间 */ dDateTime = ddate.getCurrentYMDHMS(); // 构造返回对象 MonitorInfoBean infoBean = new MonitorInfoBean(); infoBean.setOsName(osName); infoBean.setCpuRatio(cpuRatio); infoBean.setMIpAddress(mIpAddress); infoBean.setDDateTime(dDateTime); infoBean.setBuffersMemory(buffersMemory); infoBean.setCachedMemory(cachedMemory); infoBean.setUsedMemory(usedMemory); infoBean.setTotalMemorySize(totalMemorySize); infoBean.setMemoryRatio(memoryRatio); return infoBean; } /** * 获得Linux下IP地址. * * @return 返回Linux下IP地址 * @author yinliang */ public String getLinuxIP() { String ip = ""; try { Enumeration<?> e1 = (Enumeration<?>) NetworkInterface .getNetworkInterfaces(); while (e1.hasMoreElements()) { NetworkInterface ni = (NetworkInterface) e1.nextElement(); if (!ni.getName().equals("eth0")) { continue; } else { Enumeration<?> e2 = ni.getInetAddresses(); while (e2.hasMoreElements()) { InetAddress ia = (InetAddress) e2.nextElement(); if (ia instanceof Inet6Address) continue; ip = ia.getHostAddress(); } break; } } } catch (SocketException e) { e.printStackTrace(); System.exit(-1); } return ip; } public String getWindowsIp() { String ip = ""; try { ip = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } return ip; } /** * 获得Linux下CPU使用率. * * @return 返回Linux下cpu使用率 * @author yinliang */ private double getCpuRateForLinux() { InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTokenizer tokenStat = null; try { Process process = Runtime.getRuntime().exec("top -b -n 1"); is = process.getInputStream(); isr = new InputStreamReader(is); brStat = new BufferedReader(isr); if (osVersion.startsWith("2.4")) { brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine(); tokenStat = new StringTokenizer(brStat.readLine()); tokenStat.nextToken(); tokenStat.nextToken(); String user = tokenStat.nextToken(); tokenStat.nextToken(); String system = tokenStat.nextToken(); tokenStat.nextToken(); String nice = tokenStat.nextToken(); user = user.substring(0, user.indexOf("%")); system = system.substring(0, system.indexOf("%")); nice = nice.substring(0, nice.indexOf("%")); float userUsage = new Float(user).floatValue(); float systemUsage = new Float(system).floatValue(); float niceUsage = new Float(nice).floatValue(); return (userUsage + systemUsage + niceUsage) / 100; } else { brStat.readLine(); brStat.readLine(); tokenStat = new StringTokenizer(brStat.readLine()); tokenStat.nextToken(); tokenStat.nextToken(); tokenStat.nextToken(); tokenStat.nextToken(); String cpuUsage = tokenStat.nextToken(); Float usage = new Float(cpuUsage.substring(0, cpuUsage .indexOf("%"))); return ((1 - usage.floatValue() / 100) * 100); } } catch (IOException ioe) { System.out.println(ioe.getMessage()); freeResource(is, isr, brStat); return 1; } finally { freeResource(is, isr, brStat); } } private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br) { try { if (is != null) is.close(); if (isr != null) isr.close(); if (br != null) br.close(); } catch (IOException ioe) { System.out.println(ioe.getMessage()); } } /** * 获得windows下CPU使用率. * * @return 返回windows下cpu使用率 * @author YINLIANG */ private double getCpuRatioForWindows() { try { mIpAddress = InetAddress.getLocalHost().getHostAddress(); String procCmd = System.getenv("windir") + "//system32//wbem//wmic.exe process get Caption,CommandLine," + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount"; // 取进程信息 long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd)); Thread.sleep(CPUTIME); long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd)); if (c0 != null && c1 != null) { long idletime = c1[0] - c0[0]; long busytime = c1[1] - c0[1]; return Double.valueOf( PERCENT * (busytime) / (busytime + idletime)) .doubleValue(); } else { return 0.0; } } catch (Exception ex) { ex.printStackTrace(); return 0.0; } } /** * * 读取CPU信息. * * @param proc * @return * @author GuoHuang */ private long[] readCpu(final Process proc) { long[] retn = new long[2]; try { proc.getOutputStream().close(); InputStreamReader ir = new InputStreamReader(proc.getInputStream()); LineNumberReader input = new LineNumberReader(ir); String line = input.readLine(); if (line == null || line.length() < FAULTLENGTH) { return null; } int capidx = line.indexOf("Caption"); int cmdidx = line.indexOf("CommandLine"); int rocidx = line.indexOf("ReadOperationCount"); int umtidx = line.indexOf("UserModeTime"); int kmtidx = line.indexOf("KernelModeTime"); int wocidx = line.indexOf("WriteOperationCount"); long idletime = 0; long kneltime = 0; long usertime = 0; while ((line = input.readLine()) != null) { if (line.length() < wocidx) { continue; } // 字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount, // ThreadCount,UserModeTime,WriteOperation String caption = Bytes.substring(line, capidx, cmdidx - 1) .trim(); String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim(); if (cmd.indexOf("wmic.exe") >= 0) { continue; } // log.info("line="+line); if (caption.equals("System Idle Process") || caption.equals("System")) { idletime += Long.valueOf( Bytes.substring(line, kmtidx, rocidx - 1).trim()) .longValue(); idletime += Long.valueOf( Bytes.substring(line, umtidx, wocidx - 1).trim()) .longValue(); continue; } kneltime += Long.valueOf( Bytes.substring(line, kmtidx, rocidx - 1).trim()) .longValue(); usertime += Long.valueOf( Bytes.substring(line, umtidx, wocidx - 1).trim()) .longValue(); } retn[0] = idletime; retn[1] = kneltime + usertime; return retn; } catch (Exception ex) { ex.printStackTrace(); } finally { try { proc.getInputStream().close(); } catch (Exception e) { e.printStackTrace(); } } return null; } public float[] getLinuxMemInfo() { File file = new File("/proc/meminfo"); float result[] = new float[4]; try { BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(file))); String str = null; StringTokenizer token = null; while ((str = br.readLine()) != null) { token = new StringTokenizer(str); if (!token.hasMoreTokens()) { continue; } str = token.nextToken(); if (!token.hasMoreTokens()) { continue; } if (str.equalsIgnoreCase("MemTotal:")) { result[0] = Long.parseLong(token.nextToken()); } if (str.equalsIgnoreCase("Buffers:")) { result[1] = Long.parseLong(token.nextToken()); } if (str.equalsIgnoreCase("Cached:")) { result[2] = Long.parseLong(token.nextToken()); } if (str.equalsIgnoreCase("MemFree:")) { result[3] = Long.parseLong(token.nextToken()); } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } /** * 测试方法. * * @param args * @throws Exception * @author YINLIANG */ public static void information() { MonitorInfoBean monitorInfo = null; IMonitorService service = new MonitorServiceImpl(); try { monitorInfo = service.getMonitorInfoBean(); } catch (Exception e) { e.printStackTrace(); } String osName = monitorInfo.getOsName(); String cpuRatio = String.valueOf(monitorInfo.getCpuRatio()); String mIpAddress = monitorInfo.getMIpAddress(); String memoryRatio = String.valueOf(monitorInfo.getMemoryRatio()); String dDateTime = monitorInfo.getDDateTime(); System.out.println("操作系统名字:" + osName); System.out.println("cpu使用频率:" + cpuRatio); System.out.println("内存使用率:" + memoryRatio); System.out.println("主机IP地址:" + mIpAddress); System.out.println("获取数据时间:" + dDateTime); } public static void main(String[] args) { MonitorServiceImpl.information(); } }