中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java是怎么獲取主機的基本信息

發布時間:2021-12-27 08:48:38 來源:億速云 閱讀:196 作者:柒染 欄目:開發技術

Java是怎么獲取主機的基本信息,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

    最近在做一個主機資源監控的需求,首先是獲取一些最簡單的基本參,像一些主機名稱、系統類型、ip、cpu、內存和磁盤等等這些數據,看起來雖然很簡單,Java的基本庫就能完成,但是真的去使用的時候,還是有一些坑的。記錄一下,已備后用。

    1. 獲取基本信息

    1.1 獲取主機名稱和系統

    主機名稱可以通過網絡類InetAddress來獲取,主機系統和用戶可以通過System類進行獲取。

     public static void getLocalHost(){
    
         try{
    
             InetAddress ip = InetAddress.getLocalHost();
    
             String localName = ip.getHostName();
    
             String osName = System.getProperty("os.name");
    
             String userName = System.getProperty("user.name");
    
             String osVersion = System.getProperty("os.version");
    
             String osArch = System.getProperty("os.arch");
    
             
    
             System.out.println("當前用戶:" + userName);
    
             System.out.println("用戶的主目錄:"+props.getProperty("user.home"));
    
             System.out.println("用戶的當前工作目錄:"+props.getProperty("user.dir"));
    
             System.out.println("主機名稱:" + localName);
    
             System.out.println("主機系統:" + osName);
    
             System.out.println("系統版本:" + osVersion);
    
             System.out.println("系統架構:" + osArch);
    
         } catch (Exception e) {
    
             e.printStackTrace();
    
         }
    
     }

    1.2 獲取用戶信息

    用戶信息都是使用System類進行獲取。

     public static void getUserInfo(){
    
         try{
    
             String userName = System.getProperty("user.name");
    
             String userHome = System.getProperty("user.home");
    
             String userDir = System.getProperty("user.dir");
    
             
    
             System.out.println("當前用戶:" + userName);
    
             System.out.println("用戶主目錄:"+ userHome);
    
             System.out.println("當前工作目錄:"+ userDir);
    
         } catch (Exception e) {
    
             e.printStackTrace();
    
         }
    
     }

    1.3 獲取主機IP等信息

    主機的ip可以通過網絡類InetAddress進行獲取,但是這個方法很玄學,機器上多網卡還有虛擬機時,獲取到就不準確了。目前做的獲取的方法是痛毆便利網卡來獲取ip。因為遍歷網卡來獲取ip要過濾一些不重要的網卡,過濾的方法是來自“經驗”的笨方法,可以借鑒,但不保證日后網卡條件復雜的情況下獲取不準確。測試的是Linux、Mac和Windows系統可用。因為過濾條件不一樣,所以分為Windows獲取和非Windows獲取。

    Windows系統獲取IP:

     public static void getWindowsIpAndMac(){
    
         try {
    
             Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();
    
             // 遍歷網卡接口
    
             while (allNetInterfaces.hasMoreElements()) {
    
                 NetworkInterface netInterface = allNetInterfaces.nextElement();
    
                 // 去除回環接口,子接口,未運行和接口
    
                 if (netInterface.isLoopback() || netInterface.isVirtual() || !netInterface.isUp()) {
    
                     continue;
    
                 }
    
                 
    
                 // 重點來了:“經驗”之談
    
                 // 為了過濾掉虛擬機的網卡,可以通過網卡名來進行基礎過濾。windows主機ip對應的網卡名會包含下面三個:Intel  無線、Realtek  網線、Ethernet  兼容xp系統
    
                 if (!netInterface.getDisplayName().contains("Intel")
    
                     && !netInterface.getDisplayName().contains("Realtek")
    
                     && !netInterface.getDisplayName().contains("Ethernet")) {
    
                     continue;
    
                 }
    
                 
    
                 String ip = "";
    
                 String mac = "";
    
                 String niName = "";
    
                 Enumeration<InetAddress> addresses = netInterface.getInetAddresses();
    
                 while (addresses.hasMoreElements()) {
    
                     InetAddress ia = addresses.nextElement();
    
                     // 去除本地回環地址,子接口,未運行和地址
    
                     if (ia != null && !ia.isLoopbackAddress() && ia.isSiteLocalAddress() && !ia.isAnyLocalAddress()) {
    
                         // 判斷是否是ip v4地址
    
                         if (ia instanceof Inet4Address) {
    
                             ip = ia.getHostAddress();
    
                             // 獲取MAC地址
    
                             mac = getMac(ia);
    
                             niName = netInterface.getName();
    
                             if (StringUtils.isNotBlank(ip) && StringUtils.isNotBlank(mac) && StringUtils.isNotBlank(niName)){
    
                                 System.out.println("當前網卡:"+niName);
    
                                 System.out.println("當前主機ip:"+ip);
    
                                 System.out.println("當前主機MAC:"+mac);
    
                                 return;
    
                             }
    
                         }
    
                     }
    
                 }
    
             }
    
         } catch (SocketException e) {
    
             e.printStackTrace();
    
         }
    
     }

    非Windows系統獲取IP:

    其實和windows獲取的差不多,也是遍歷網卡然后進行過濾,不過這個沒有“經驗”,不知道要過濾那些,所以用InetAddress進行獲取,經測試這個在非windows上獲取的還是準確的(可能我linux網卡單一)。不過為了獲取當前的網卡用了一個更笨的方法,既然當前獲取的ip是準確的,那就根據ip去獲取網卡。不過目前沒有找到這個方法,所以可以在遍歷網卡時取出符合當前ip的網卡。(此方法在我這個需求里是可以的,不保證拿走就能用)。

     public static void getLinuxIpAndMac(AgentMonitor agentMonitor){
    
         try {
    
             // 先獲取ip
    
             InetAddress iad = InetAddress.getLocalHost();
    
             String localIp = iad.getHostAddress();
    
     
    
             // 遍歷網卡
    
             Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();
    
             while (allNetInterfaces.hasMoreElements()) {
    
                 NetworkInterface netInterface = allNetInterfaces.nextElement();
    
                 // 去除回環接口,子接口,未運行和接口
    
                 if (netInterface.isLoopback() || netInterface.isVirtual() || !netInterface.isUp()) {
    
                     continue;
    
                 }
    
     
    
                 String ip = "";
    
                 String mac = "";
    
                 String niName = "";
    
                 Enumeration<InetAddress> addresses = netInterface.getInetAddresses();
    
                 while (addresses.hasMoreElements()) {
    
                     InetAddress ia = addresses.nextElement();
    
                     if (ia != null && !ia.isLoopbackAddress() && ia.isSiteLocalAddress() && !ia.isAnyLocalAddress()) {
    
                         // 判斷是否是ip v4地址且是否和已獲取的ip一致
    
                         if (ia instanceof Inet4Address && ia.getHostAddress().equals(localIp)) {
    
                             ip = ia.getHostAddress();
    
                             // 獲取MAC地址
    
                             mac = getMac(ia);
    
                             niName = netInterface.getName();
    
                             if (StringUtils.isNotBlank(ip) && StringUtils.isNotBlank(mac) && StringUtils.isNotBlank(niName)){
    
                                 System.out.println("當前網卡:"+niName);
    
                                 System.out.println("當前主機ip:"+ip);
    
                                 System.out.println("當前主機MAC:"+mac);
    
                                 return;
    
                             }
    
                         }
    
                     }
    
                 }
    
             }
    
     
    
         } catch (Exception e) {
    
             e.printStackTrace();
    
         }
    
     }

    獲取MAC地址

     public static String getMac(InetAddress ia){
    
         try {
    
             //獲取網卡,獲取地址
    
             byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();
    
             StringBuffer sb = new StringBuffer();
    
             if (mac != null && mac.length>0){
    
                 for(int i=0; i<mac.length; i++) {
    
                     if(i!=0) {
    
                         sb.append("-");
    
                     }
    
                     //字節轉換為整數
    
                     String str = Integer.toHexString(mac[i] & 0xff);
    
                     if(str.length()==1) {
    
                         sb.append("0").append(str);
    
                     }else {
    
                         sb.append(str);
    
                     }
    
                 }
    
             }
    
             return sb.toString().toUpperCase();
    
         } catch (SocketException e) {
    
             e.printStackTrace();
    
             return null;
    
         }
    
     }

    2. 獲取CPU信息

    獲取CPU的信息這里選用的是oshi工具,經測試這個獲取的還是比較準確的,而且該工具還可以獲得其他硬件信息,能獲取到的還是比較全面的。首先需要引入oshi的依賴。

     <dependency>
    
         <groupId>com.github.oshi</groupId>
    
         <artifactId>oshi-core</artifactId>
    
         <version>3.12.2</version>
    
     </dependency>

    oshi是依賴于JNA,需要導入jna和jna-platform我這里用的oshi是3.12.2版本,對應使用的JNA的版本是5.2.0。springboot項目是自帶JNA的,如果不是springboot項目需要額外導入。如果springboot項目自帶的JNA版本過低,也需要額外導入高版本的JNA。

    <dependency>

    <groupId>net.java.dev.jna</groupId>

    <artifactId>jna</artifactId>

    <version>5.2.0</version>

    </dependency>

    Java是怎么獲取主機的基本信息

    JNA版本信息

    2.1 獲取CPU核數

    oshi中的CentralProcessor進行獲取。獲取CPU物理可用的核數,如果有開啟超頻,那么獲取的CPU核數可能會大于物理核數。

     public static void getCpuCount(){
    
         try {
    
             // 獲取SystemInfo實例
    
             SystemInfo systemInfo = new SystemInfo();
    
             // 獲取CentralProcessor實例
    
             CentralProcessor processor = systemInfo.getHardware().getProcessor();
    
             // 獲取CPU核數
    
             int cpuCount = processor.getLogicalProcessorCount();
    
             System.out.println("CPU核數:"+cpuCount);
    
         } catch (SocketException e) {
    
             e.printStackTrace();
    
         }
    
     }

    2.2 獲取CPU使用率

    獲取系統范圍的CPU負載時,一共獲取7個部分的負載。

    • CPU 空閑且系統沒有未完成的磁盤 I/O 請求的時間。

    • 在系統有未完成的磁盤 I/O 請求期間一個或多個 CPU 空閑的時間。在windows不可用。在MacOS不可用。

    • CPU 用于服務硬件 IRQ 的時間。在MacOS不可用。

    • 在具有良好優先級的用戶級別執行時發生的 CPU 利用率。在windows不可用。

    • CPU 用于服務軟 IRQ 的時間。

    • 管理程序專用于系統中其他來賓的時間。

    • 在系統級別(內核)執行時發生的 CPU 利用率。

    • 在用戶級別(應用程序)執行時發生的 CPU 使用率。

    要使用此方法計算總體空閑時間,就要包括上面所有部分,這樣計算出來的結果更準確且兼容各種平臺。分兩次獲取上面信息,間隔1秒。這樣就能計算出1秒的CPU各方面使用的差值,通過每一項的差值除以總量,便可以得到每一項的CPU使用率。

    通過下面方法還可以獲得CPU時間間隔內的使用率和總使用率。

     public static void getCpuInfo() {
    
         try {
    
             SystemInfo systemInfo = new SystemInfo();
    
             CentralProcessor processor = systemInfo.getHardware().getProcessor();
    
             // 獲取系統范圍的cpu負載技計數
    
             long[] prevTicks = processor.getSystemCpuLoadTicks();
    
             // 睡眠1s
    
             TimeUnit.SECONDS.sleep(1);
    
             long[] ticks = processor.getSystemCpuLoadTicks();
    
             // 具有良好優先級的用戶級別
    
             long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
    
             // 硬件服務
    
             long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
    
             // 軟服務使用
    
             long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
    
             // 管理程序使用
    
             long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
    
             // 系統使用
    
             long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
    
             // 用戶使用
    
             long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
    
             // 等待使用
    
             long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
    
             // 空閑使用
    
             long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
    
             long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
    
             double sysRate = cSys * 1.0 / totalCpu;
    
             double userRate = user * 1.0 / totalCpu;
    
             double waitRate = cSys * 1.0 / totalCpu;
    
             double idleRate = cSys * 1.0 / totalCpu;
    
             double betweenRate = processor.getSystemCpuLoadBetweenTicks();
    
             double cpuLoad = processor.getSystemCpuLoad();
    
             System.out.println("cpu系統使用率:" + new DecimalFormat("#.##%").format(sysRate));
    
             System.out.println("cpu用戶使用率:" + new DecimalFormat("#.##%").format(userRate));
    
             System.out.println("cpu當前等待率:" + new DecimalFormat("#.##%").format(waitRate));
    
             System.out.println("cpu當前空閑率:" + new DecimalFormat("#.##%").format(idleRate));
    
             // 獲取cpu最近(時間間隔內)使用率
    
             System.out.println("CPU load: "+ new DecimalFormat("#.##%").format(betweenRate) +"(counting ticks)");
    
             // 獲取cpu使用率
    
             System.out.println("CPU load: "+ new DecimalFormat("#.##%").format(cpuLoad) +"(OS MXBean)");
    
         }catch (Exception e){
    
             e.printStackTrace();
    
         }
    
     }

    3. 獲取內存信息

    3.1 獲取主機內存

    獲取內存信息可以使用OperatingSystemMXBean 來獲取。內存信息可以獲取到的有內存總量和可用內存,通過這兩個值在計算出內存已經使用的量和內存的使用率。獲取內存信息同樣也可以使用oshi包中的SystemInfo類進行獲取。但是測試時獲取的數據沒有OperatingSystemMXBean獲取的更精確。

     public static void getMemInfo(){
    
         try {
    
             OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    
             // 總內存,單位:字節
    
                 long total = osmxb.getTotalPhysicalMemorySize();
    
                 // 空閑內存,單位:字節
    
                 long free = osmxb.getFreePhysicalMemorySize();
    
                 // 可用內存,單位:字節
    
                 long usable = osmxb.getFreePhysicalMemorySize();
    
                 // 已使用內存,單位:字節
    
                 long used = total - free;
    
                 // 內存使用率
    
                 double useRate = used * 1.0 / total;
    
                 System.out.println("總共內存:" + new DecimalFormat("#.##").format(total*1.0 / Math.pow(1024,3)) + "G");
    
                 System.out.println("空閑內存:" + new DecimalFormat("#.##").format(free*1.0 / Math.pow(1024,3)) + "G");
    
                 System.out.println("已用內存:" + new DecimalFormat("#.##").format(used*1.0 / Math.pow(1024,3)) + "G");
    
                 System.out.println("可用內存:" + new DecimalFormat("#.##").format(usable*1.0 / Math.pow(1024,3)) + "G");
    
                 System.out.println("內存使用率:" + new DecimalFormat("#.##%").format(useRate * 100.0));
    
     
    
         }catch (Exception e){
    
             e.printStackTrace();
    
         }
    
     }

    3.2 獲取JVM內存

    獲取JVM的內存信息需要使用MemoryMXBean接口中的MemoryUsage類。JVM信息主要是在系統運行時對JVM的使用情況。包括初始的內存大小、最大可用的內存以及當前已經使用的內存大小。

     public static void getJvmMemInfo(){
    
         try {
    
             MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
    
             // 椎內存使用情況
    
             MemoryUsage memoryUsage = memoryMXBean.getHeapMemoryUsage();
    
             // jvm初始總內存,單位:字節
    
             long initTotalMemorySize = memoryUsage.getInit();
    
             // jvm最大可用內存,單位:字節
    
             long free = osmxb.getFreePhysicalMemorySize();
    
             // jvm已使用的內存,單位:字節
    
             long usable = osmxb.getFreePhysicalMemorySize();
    
             
    
             System.out.println("jvm初始總內存:" + new DecimalFormat("#.##").format(total*1.0 / Math.pow(1024,3)) + "G");
    
             System.out.println("jvm最大可用內存:" + new DecimalFormat("#.##").format(free*1.0 / Math.pow(1024,3)) + "G");
    
             System.out.println("jvm已使用的內存:" + new DecimalFormat("#.##").format(used*1.0 / Math.pow(1024,3)) + "G");
    
     
    
         }catch (Exception e){
    
             e.printStackTrace();
    
         }
    
     }

    4. 獲取磁盤信息

    獲取磁盤的使用情況用的是基礎的File類。首先是從根目錄遍歷所有磁盤信息,通過下面方法獲取磁盤信息。

    • file.getTotalSpace() :獲取當前磁盤的總內存

    • file.getFreeSpace() :獲取當前磁盤的空閑內存

    • file.getUsableSpace() :獲取當前磁盤的可用內存

    通過上面獲取的三個參數,可以計算磁盤總的已使用內存和當前磁盤的內存使用率。

    在計算每一個磁盤的信息時,通過全局變量統計所有磁盤的信息總和,然后計算出主機總的磁盤內存和使用率。

     /**
    
      * @param RADIX 內存進制大小,"經驗"之談是:Windows下進制是1024,Mac和Linux是1000
    
      */
    
     public static void getDiskInfo(int RADIX){
    
         // 統計總內存
    
         long total = 0;
    
         // 統計總空閑
    
         long free = 0;
    
         // 統計總可用
    
         long usable = 0;
    
         // 統計總已用
    
         long used = 0;
    
         // 磁盤總使用
    
         double usedRate = 0.0;
    
         try{
    
     
    
             File[] disks = File.listRoots();
    
             for (File file : disks){
    
                 // 統計總量
    
                 total += file.getTotalSpace();
    
                 free += file.getFreeSpace();
    
                 usable += file.getUsableSpace();
    
                 used += file.getTotalSpace() - file.getFreeSpace();
    
                 
    
                 String diskPath = file.getPath();
    
                 long diskTotal = file.getTotalSpace();
    
                 long diskFree = file.getFreeSpace();
    
                 long diskUsable = file.getUsableSpace();
    
                 long diskUsed = diskTotal - diskFree;
    
                 double diskUsedRate = diskUsed * 1.0 / diskTotal;
    
              
    
                 System.out.println("磁盤路徑:" + diskPath);
    
                 System.out.println("總共空間:"+ new DecimalFormat("#.##").format(diskTotal*1.0 / Math.pow(RADIX,3)) + "G");
    
                 System.out.println("空閑空間:"+ new DecimalFormat("#.##").format(diskFree*1.0 / Math.pow(RADIX,3)) + "G");
    
                 System.out.println("可用空間:"+ new DecimalFormat("#.##").format(diskUsable*1.0 / Math.pow(RADIX,3)) + "G");
    
                 System.out.println("已用空間:"+ new DecimalFormat("#.##").format(diskUsed*1.0 / Math.pow(RADIX,3)) + "G");
    
                 System.out.println("空間使用率:" + new DecimalFormat("#.##%").format(diskUsedRate*100));
    
                 
    
             }
    
             
    
             String rootPath = "/";
    
             usedRate = used * 1.0 / total;
    
             
    
             System.out.println("磁盤根路徑:"+ rootPath);
    
             System.out.println("主機總共空間:"+ new DecimalFormat("#.##").format(total*1.0 / Math.pow(RADIX,3)) + "G");
    
             System.out.println("主機總空閑空間:"+ new DecimalFormat("#.##").format(free*1.0 / Math.pow(RADIX,3)) + "G");
    
             System.out.println("主機總可用空間:"+ new DecimalFormat("#.##").format(usable*1.0 / Math.pow(RADIX,3)) + "G");
    
             System.out.println("主機總已用空間:"+ new DecimalFormat("#.##").format(used*1.0 / Math.pow(RADIX,3)) + "G");
    
             System.out.println("主機總使用率:" + new DecimalFormat("#.##%").format(usedRate*100.0));
    
             
    
         }catch (Exception e){
    
             e.printStackTrace();
    
         }
    
     }

    5. 獲取Java環境信息

    這塊就是補充說明了,暫時沒用到,先保留一下,已備后用。

     public static void getJavaInfo(){
    
         Properties props=System.getProperties();
    
         System.out.println("Java的運行環境版本:"+props.getProperty("java.version"));
    
         System.out.println("Java的運行環境供應商:"+props.getProperty("java.vendor"));
    
         System.out.println("Java供應商的URL:"+props.getProperty("java.vendor.url"));
    
         System.out.println("Java的安裝路徑:"+props.getProperty("java.home"));
    
         System.out.println("Java的虛擬機規范版本:"+props.getProperty("java.vm.specification.version"));
    
         System.out.println("Java的虛擬機規范供應商:"+props.getProperty("java.vm.specification.vendor"));
    
         System.out.println("Java的虛擬機規范名稱:"+props.getProperty("java.vm.specification.name"));
    
         System.out.println("Java的虛擬機實現版本:"+props.getProperty("java.vm.version"));
    
         System.out.println("Java的虛擬機實現供應商:"+props.getProperty("java.vm.vendor"));
    
         System.out.println("Java的虛擬機實現名稱:"+props.getProperty("java.vm.name"));
    
         System.out.println("Java運行時環境規范版本:"+props.getProperty("java.specification.version"));
    
         System.out.println("Java運行時環境規范供應商:"+props.getProperty("java.specification.vender"));
    
         System.out.println("Java運行時環境規范名稱:"+props.getProperty("java.specification.name"));
    
         System.out.println("Java的類格式版本號:"+props.getProperty("java.class.version"));
    
         System.out.println("Java的類路徑:"+props.getProperty("java.class.path"));
    
         System.out.println("加載庫時搜索的路徑列表:"+props.getProperty("java.library.path"));
    
         System.out.println("默認的臨時文件路徑:"+props.getProperty("java.io.tmpdir"));
    
         System.out.println("一個或多個擴展目錄的路徑:"+props.getProperty("java.ext.dirs"));
    
        
    
         System.out.println("文件分隔符:"+props.getProperty("file.separator"));//在 unix 系統中是"/" System.out.println("路徑分隔符:"+props.getProperty("path.separator"));//在 unix 系統中是":" System.out.println("行分隔符:"+props.getProperty("line.separator"));//在 unix 系統中是"/n" System.out.println("用戶的賬戶名稱:"+props.getProperty("user.name
    
     }

    看完上述內容,你們掌握Java是怎么獲取主機的基本信息的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    方城县| 宿迁市| 札达县| 淅川县| 台山市| 蒙自县| 饶平县| 孟津县| 新乡市| 灌南县| 德惠市| 美姑县| 盐山县| 寿光市| 溧阳市| 平昌县| 阜平县| 金门县| 商洛市| 竹北市| 青州市| 云霄县| 莱州市| 乐平市| 长治县| 深泽县| 余庆县| 荣昌县| 九江县| 嘉义县| 江永县| 阜阳市| 晋中市| 中山市| 探索| 会理县| 灌云县| 彰化县| 汝南县| 正蓝旗| 铜鼓县|