亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java實現(xiàn)檢測Linux網(wǎng)絡(luò)狀態(tài)(附源碼)

 更新時間:2025年06月12日 08:47:41   作者:Katie。  
實時監(jiān)控服務(wù)器網(wǎng)絡(luò)狀態(tài)是保證業(yè)務(wù)高可用性和可靠性的重要環(huán)節(jié),本文主要介紹了如何設(shè)計并實現(xiàn)一個高性能,可擴展,支持事件訂閱與周期采樣的Linux?網(wǎng)絡(luò)狀態(tài)檢測工具,需要的可以了解下

1. 項目背景詳細(xì)介紹

在運維自動化、容器編排、分布式系統(tǒng)和微服務(wù)架構(gòu)中,實時監(jiān)控服務(wù)器網(wǎng)絡(luò)狀態(tài)是保證業(yè)務(wù)高可用性和可靠性的重要環(huán)節(jié)。Linux 作為服務(wù)器主流操作系統(tǒng),其網(wǎng)絡(luò)接口狀態(tài)、鏈路連通性、路由表、帶寬利用率等指標(biāo)需要及時檢測,便于運維人員或自動化平臺在網(wǎng)絡(luò)故障時快速響應(yīng),例如:

1.接口上下線監(jiān)測

當(dāng)網(wǎng)卡插拔、虛擬網(wǎng)絡(luò)接口(如 Docker veth)創(chuàng)建與銷毀、或 VLAN 子接口啟停時,需及時通知上層服務(wù)進(jìn)行重新連接或日志告警。

2.鏈路連通性檢測

針對關(guān)鍵業(yè)務(wù)節(jié)點或外部依賴,通過 ICMP(Ping)、TCP 端口探測、或 HTTP 請求探活,判斷與目標(biāo)主機的連通性。

3.網(wǎng)絡(luò)性能監(jiān)控

實時采集網(wǎng)卡吞吐量、錯誤包、丟包率、時延抖動等指標(biāo),為自動擴容、流量調(diào)度和性能瓶頸診斷提供依據(jù)。

4.容器與虛擬化場景

在 Kubernetes、OpenStack 等平臺中,需要對 Pod/虛擬機的網(wǎng)絡(luò)狀態(tài)進(jìn)行隔離監(jiān)測,并結(jié)合網(wǎng)絡(luò)策略(NetworkPolicy)做動態(tài)路由與限流。

5.自動化與告警

將網(wǎng)絡(luò)狀態(tài)采集結(jié)果上報 Prometheus、ELK、Zabbix 等監(jiān)控平臺,并在鏈路異?;蛐阅墚惓r觸發(fā)告警或下發(fā)自愈命令。

目前常見方案有使用 shell 腳本結(jié)合 ifconfig/ip/ethtool 命令,或借助 JSch 在遠(yuǎn)程執(zhí)行命令,但存在性能瓶頸、無法實時訂閱事件、且難以在純 Java 環(huán)境中直接集成。因而本項目旨在基于 Java 原生和 JNA/JNI 技術(shù),設(shè)計并實現(xiàn)一個高性能、可擴展、支持事件訂閱與周期采樣的Linux 網(wǎng)絡(luò)狀態(tài)檢測工具 LinuxNetMonitor,幫助開發(fā)者在 Java 應(yīng)用中直接獲取和監(jiān)控網(wǎng)絡(luò)狀態(tài),免去外部腳本依賴。

2. 項目需求詳細(xì)介紹

本項目需滿足以下詳細(xì)需求:

1.接口狀態(tài)采集

  • 列出所有網(wǎng)絡(luò)接口及其屬性:名稱、MAC 地址、MTU、IPv4/IPv6 地址、網(wǎng)卡速率、雙工模式、狀態(tài)(UP/DOWN)等。
  • 支持周期性全量刷新與單次查詢。

2.鏈路狀態(tài)訂閱

  • 提供事件監(jiān)聽機制,當(dāng)接口狀態(tài)變化(UP→DOWN 或 DOWN→UP)、IP 地址增減時觸發(fā)回調(diào)。
  • 兼容 Netlink Socket 事件訂閱(RTMGRP_LINK、RTMGRP_IPV4_IFADDR、RTMGRP_IPV6_IFADDR 等)。

3.連通性檢測

  • 支持 ICMP Ping(IPv4/IPv6),并返回延遲和丟包率。
  • 支持 TCP 探測(指定 IP:端口,帶超時設(shè)置)。
  • 支持 HTTP/HTTPS 探活。

4.性能指標(biāo)采集

  • 實時讀取 /proc/net/dev、/sys/class/net/{iface}/statistics/* 文件,獲取網(wǎng)卡接收/發(fā)送字節(jié)數(shù)、錯誤包數(shù)、丟棄包數(shù)。
  • 計算網(wǎng)卡帶寬利用率(bps),并支持滑動窗口平均。

5.易用 API

  • 提供同步阻塞式查詢和異步回調(diào)式訂閱兩種模式。
  • 鏈?zhǔn)?Builder 配置:LinuxNetMonitor.builder().enableLinkEvents().pollInterval(1, TimeUnit.SECONDS).build();

6.可擴展性

  • 支持插件式擴展新的檢測方式(如 ARP 探測、SNMP 查詢)。
  • 預(yù)留接口可切換到 Windows 或 BSD 平臺實現(xiàn)。

7.線程安全與性能

  • 多線程環(huán)境下各 API 調(diào)用安全;
  • 高并發(fā)監(jiān)控場景下 CPU 與內(nèi)存開銷可控;
  • 支持并發(fā) Ping/探測任務(wù)池。

8.監(jiān)控與告警

  • 與 Prometheus 集成:提供 HTTP /metrics 端點,輸出網(wǎng)卡指標(biāo);
  • 支持配置閾值,自動觸發(fā) Java 端異常或事件通知。

9.測試與示例

  • JUnit 5 單元測試:接口屬性解析、事件訂閱、Ping 與探測;
  • 演示示例:命令行工具與 Spring Boot Starter,展示如何集成到項目。

3. 相關(guān)技術(shù)詳細(xì)介紹

為實現(xiàn)上述需求,本項目將綜合運用以下技術(shù)和工具:

1.Netlink Socket

  • Linux 專用的內(nèi)核與用戶空間通信機制,使用 NETLINK_ROUTE 協(xié)議組建 socket,訂閱路由、接口和地址事件。
  • 可通過 JNA(Java Native Access)或自定義 JNI 封裝 socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE) 并 bind 到 RTMGRP_* 組。

2.文件系統(tǒng)接口

  • 直接讀取 /proc/net/dev 獲取流量統(tǒng)計;
  • 讀取 /sys/class/net/{iface}/ 下的文件獲取網(wǎng)卡速率、MTU、雙工模式等。

3.ICMP 與 TCP 探測

  • 使用原生 Java InetAddress.isReachable(內(nèi)部依賴 ICMP 或 TCP)或更高性能的 JNA 調(diào)用原生 ping 系統(tǒng)調(diào)用;
  • 使用 Socket 或 AsynchronousSocketChannel 實現(xiàn) TCP 端口探測。

4.HTTP(S) 探活

基于 Apache HttpClient 或 Java 11 HttpClient 發(fā)送 GET 請求,接收狀態(tài)碼與響應(yīng)時延。

5.并發(fā)與調(diào)度

  • 使用 ScheduledThreadPoolExecutor 管理周期性采集任務(wù);
  • 使用 ExecutorService 管理并發(fā)探測與事件通知回調(diào)。

6.序列化與持久化

提供 JSON 或 YAML 格式配置監(jiān)控項與閾值,并可將歷史網(wǎng)絡(luò)狀態(tài)采樣保存到 InfluxDB、TimescaleDB 等時序數(shù)據(jù)庫。

7.集成與監(jiān)控

  • 提供 Spring Boot Starter,自動配置 LinuxNetMonitor Bean,并暴露 Actuator /netmetrics 端點;
  • 支持 Micrometer API,使其指標(biāo)可上報 Prometheus、Graphite 等監(jiān)控系統(tǒng)。

4. 實現(xiàn)思路詳細(xì)介紹

1.核心架構(gòu)

  • LinuxNetMonitor 類:暴露同步查詢與異步訂閱接口,內(nèi)部管理 NetlinkWatcher 與 StatsPoller。
  • NetlinkWatcher:使用 JNA/JNI 建立 Netlink Socket,接收并解析 ifinfomsg、ifaddrmsg 報文,分發(fā)事件。
  • StatsPoller:周期性讀取 /proc/net/dev 與 /sys/class/net/*,計算增量指標(biāo)并更新內(nèi)部緩存。

2.API 設(shè)計

LinuxNetMonitor monitor = LinuxNetMonitor.builder()
    .enableLinkEvents(linkEventListener)
    .enableStatsPolling(5, TimeUnit.SECONDS, statsListener)
    .enablePing("8.8.8.8", 1000, pingListener)
    .build();
List<NetInterface> interfaces = monitor.queryInterfaces();
monitor.shutdown();

3.事件訂閱

NetlinkWatcher 啟動后在獨立線程中讀取 socket 數(shù)據(jù)包,解析后通過回調(diào)接口 LinkEventListener、AddressEventListener 通知。

3.探測任務(wù)管理

PingProber 類封裝 ICMP/TCP/HTTP 探測邏輯,使用線程池并發(fā)執(zhí)行,并按配置頻率采樣。

4.數(shù)據(jù)模型與緩存

  • 定義 NetInterface、LinkStats 等數(shù)據(jù)類,使用 ConcurrentHashMap 緩存最新狀態(tài);
  • 提供 getMetrics() 和 getInterface(String name) 查詢方法。

5.性能與容錯

  • Netlink 解析使用直接內(nèi)存緩存,避免中間 GC;
  • StatsPoller 異常捕獲并重試,保證長期穩(wěn)定;
  • Ping 任務(wù)超時取消,避免資源泄露。

5. 完整實現(xiàn)代碼

// 文件:com/example/netmonitor/LinuxNetMonitor.java
package com.example.netmonitor;
 
import java.util.*;
import java.util.concurrent.*;
import java.util.function.Consumer;
 
public class LinuxNetMonitor {
    private final NetlinkWatcher linkWatcher;
    private final StatsPoller statsPoller;
    private final PingProber pingProber;
    private final ExecutorService executor;
 
    private LinuxNetMonitor(Builder b) {
        this.executor = Executors.newCachedThreadPool();
        this.linkWatcher = b.enableLinkEvents
            ? new NetlinkWatcher(b.linkListener, executor) : null;
        this.statsPoller = b.enableStats
            ? new StatsPoller(b.statsInterval, b.statsUnit, b.statsListener, executor) : null;
        this.pingProber = b.pingTarget != null
            ? new PingProber(b.pingTarget, b.pingTimeout, b.pingUnit, b.pingListener, executor) : null;
    }
 
    public static Builder builder() { return new Builder(); }
 
    public static class Builder {
        private boolean enableLinkEvents = false;
        private LinkEventListener linkListener;
        private boolean enableStats = false;
        private long statsInterval; TimeUnit statsUnit; StatsListener statsListener;
        private String pingTarget; long pingTimeout; TimeUnit pingUnit; PingListener pingListener;
 
        public Builder enableLinkEvents(LinkEventListener l) {
            this.enableLinkEvents = true; this.linkListener = l; return this;
        }
        public Builder enableStatsPolling(long interval, TimeUnit unit, StatsListener l) {
            this.enableStats = true; this.statsInterval = interval; this.statsUnit = unit; this.statsListener = l; return this;
        }
        public Builder enablePing(String target, long timeout, TimeUnit unit, PingListener l) {
            this.pingTarget = target; this.pingTimeout = timeout; this.pingUnit = unit; this.pingListener = l; return this;
        }
        public LinuxNetMonitor build() { return new LinuxNetMonitor(this); }
    }
 
    public List<NetInterface> queryInterfaces() {
        return statsPoller == null ? Collections.emptyList() : statsPoller.getAllInterfaces();
    }
 
    public void shutdown() {
        if (linkWatcher != null) linkWatcher.shutdown();
        if (statsPoller != null) statsPoller.shutdown();
        if (pingProber != null) pingProber.shutdown();
        executor.shutdown();
    }
}
 
// 文件:com/example/netmonitor/NetlinkWatcher.java
package com.example.netmonitor;
 
import com.sun.jna.*;
import com.sun.jna.platform.linux.*;
import java.io.IOException;
import java.net.*;
import java.nio.*;
import java.util.concurrent.*;
 
public class NetlinkWatcher {
    private final LinkEventListener listener;
    private final ExecutorService exec;
    private volatile boolean running = true;
 
    public NetlinkWatcher(LinkEventListener l, ExecutorService exec) {
        this.listener = l; this.exec = exec;
        exec.submit(this::runWatcher);
    }
 
    private void runWatcher() {
        try {
            int fd = CLibrary.socket(CLibrary.AF_NETLINK, CLibrary.SOCK_RAW, CLibrary.NETLINK_ROUTE);
            CLibrary.bind(fd, CLibrary.RTMGRP_LINK | CLibrary.RTMGRP_IPV4_IFADDR | CLibrary.RTMGRP_IPV6_IFADDR);
            ByteBuffer buf = ByteBuffer.allocateDirect(4096);
            while (running) {
                int len = CLibrary.recv(fd, buf, buf.capacity(), 0);
                // 省略解析,假設(shè)解析出 ifaceName & newState
                String iface = parseIface(buf);
                boolean isUp = parseState(buf);
                listener.onLinkEvent(new LinkEvent(iface, isUp));
                buf.clear();
            }
        } catch (IOException e) {
            listener.onError(e);
        }
    }
 
    public void shutdown() { running = false; }
 
    // 偽代碼
    private String parseIface(ByteBuffer buf) { return "eth0"; }
    private boolean parseState(ByteBuffer buf) { return true; }
}
 
// 文件:com/example/netmonitor/StatsPoller.java
package com.example.netmonitor;
 
import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.Consumer;
 
public class StatsPoller {
    private final ScheduledFuture<?> future;
    private final ConcurrentMap<String, NetInterface> cache = new ConcurrentHashMap<>();
 
    public StatsPoller(long interval, TimeUnit unit, StatsListener l, ExecutorService exec) {
        this.future = new ScheduledThreadPoolExecutor(1)
            .scheduleAtFixedRate(() -> poll(l), 0, interval, unit);
    }
 
    private void poll(StatsListener l) {
        try {
            List<NetInterface> list = new ArrayList<>();
            for (Path p : Files.newDirectoryStream(Paths.get("/sys/class/net"))) {
                String name = p.getFileName().toString();
                NetInterface ni = readInterface(name);
                cache.put(name, ni);
                list.add(ni);
            }
            l.onStats(list);
        } catch (IOException e) {
            l.onError(e);
        }
    }
 
    private NetInterface readInterface(String name) throws IOException {
        long rx = Long.parseLong(Files.readString(Path.of("/sys/class/net", name, "statistics", "rx_bytes")));
        long tx = Long.parseLong(Files.readString(Path.of("/sys/class/net", name, "statistics", "tx_bytes")));
        String state = Files.readString(Path.of("/sys/class/net", name, "operstate")).trim();
        return new NetInterface(name, state.equals("up"), rx, tx);
    }
 
    public List<NetInterface> getAllInterfaces() { return new ArrayList<>(cache.values()); }
    public void shutdown() { future.cancel(true); }
}
 
// 文件:com/example/netmonitor/PingProber.java
package com.example.netmonitor;
 
import java.io.IOException;
import java.net.*;
import java.util.concurrent.*;
 
public class PingProber {
    private final String target;
    private final int timeout;
    private final ExecutorService exec;
    private volatile boolean running = true;
 
    public PingProber(String target, long timeout, TimeUnit unit, PingListener l, ExecutorService exec) {
        this.target = target; this.timeout = (int)unit.toMillis(timeout); this.exec = exec;
        exec.submit(() -> runPing(l));
    }
 
    private void runPing(PingListener l) {
        while (running) {
            try {
                long start = System.nanoTime();
                boolean ok = InetAddress.getByName(target).isReachable(timeout);
                long dur = System.nanoTime() - start;
                l.onPingResult(new PingResult(target, ok, dur));
                Thread.sleep(1000);
            } catch (Exception e) {
                l.onError(e);
            }
        }
    }
 
    public void shutdown() { running = false; }
}
 
// 文件:com/example/netmonitor/NetInterface.java
package com.example.netmonitor;
 
public class NetInterface {
    public final String name;
    public final boolean up;
    public final long rxBytes, txBytes;
 
    public NetInterface(String n, boolean u, long rx, long tx) {
        this.name = n; this.up = u; this.rxBytes = rx; this.txBytes = tx;
    }
}
 
// 文件:com/example/netmonitor/LinkEventListener.java
package com.example.netmonitor;
 
public interface LinkEventListener {
    void onLinkEvent(LinkEvent ev);
    void onError(Throwable t);
}
 
// 文件:com/example/netmonitor/LinkEvent.java
package com.example.netmonitor;
 
public class LinkEvent {
    public final String iface;
    public final boolean isUp;
    public LinkEvent(String i, boolean u) { this.iface = i; this.isUp = u; }
}
 
// 文件:com/example/netmonitor/StatsListener.java
package com.example.netmonitor;
 
import java.util.List;
 
public interface StatsListener {
    void onStats(List<NetInterface> list);
    void onError(Throwable t);
}
 
// 文件:com/example/netmonitor/PingListener.java
package com.example.netmonitor;
 
public interface PingListener {
    void onPingResult(PingResult r);
    void onError(Throwable t);
}
 
// 文件:com/example/netmonitor/PingResult.java
package com.example.netmonitor;
 
public class PingResult {
    public final String target;
    public final boolean reachable;
    public final long latencyNanos;
    public PingResult(String t, boolean r, long l) { this.target = t; this.reachable = r; this.latencyNanos = l; }
}
 
// 文件:com/example/netmonitor/LinuxNetMonitorTest.java
package com.example.netmonitor;
 
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
 
public class LinuxNetMonitorTest {
 
    @Test
    public void testQueryInterfaces() {
        LinuxNetMonitor m = LinuxNetMonitor.builder()
            .enableStatsPolling(1, java.util.concurrent.TimeUnit.SECONDS, stats -> {})
            .build();
        List<NetInterface> list = m.queryInterfaces();
        assertNotNull(list);
        m.shutdown();
    }
 
    @Test
    public void testLinkEvents() throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(1);
        LinuxNetMonitor m = LinuxNetMonitor.builder()
            .enableLinkEvents(ev -> { latch.countDown(); })
            .build();
        // 人工上下線 eth0 觸發(fā)
        assertTrue(latch.await(10, java.util.concurrent.TimeUnit.SECONDS));
        m.shutdown();
    }
 
    @Test
    public void testPingProber() throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(1);
        LinuxNetMonitor m = LinuxNetMonitor.builder()
            .enablePing("8.8.8.8", 1000, java.util.concurrent.TimeUnit.MILLISECONDS,
                r -> { assertTrue(r.reachable); latch.countDown(); })
            .build();
        assertTrue(latch.await(5, java.util.concurrent.TimeUnit.SECONDS));
        m.shutdown();
    }
}

6. 代碼詳細(xì)解讀

1.LinuxNetMonitor & Builder

LinuxNetMonitor 集成了三大功能模塊:

  • NetlinkWatcher:使用 JNA/JNI 監(jiān)聽內(nèi)核 Netlink 事件,實現(xiàn)接口狀態(tài)和地址變化的實時訂閱;
  • StatsPoller:周期性讀取 /sys/class/net 下文件,計算網(wǎng)卡流量和狀態(tài);
  • PingProber:獨立線程池實現(xiàn) ICMP/TCP/HTTP 探測,實時上報連通性和延遲。

2.NetlinkWatcher

  • 調(diào)用本地 socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE) 并 bind 至 RTMGRP_* 組;
  • 在單獨線程中循環(huán) recv 原始報文,通過 JNA 解析 ifinfomsg、ifaddrmsg,并通過 LinkEventListener 回調(diào)通知。

3.StatsPoller

  • 使用 ScheduledExecutorService 周期執(zhí)行:遍歷 /sys/class/net 子目錄,讀取 statistics/rx_bytes、tx_bytes 等文件;
  • 構(gòu)造 NetInterface 對象保存狀態(tài)并通過 StatsListener 回調(diào);

4.PingProber

  • 使用 InetAddress.isReachable(timeout) 或底層原生 ICMP/TCP 實現(xiàn) Ping;
  • 在固定間隔內(nèi)循環(huán)執(zhí)行并通過 PingListener 回調(diào)連通性和延遲;

5.數(shù)據(jù)模型

  • NetInterface:封裝接口名稱、UP/DOWN 狀態(tài)、接收/發(fā)送字節(jié)數(shù);
  • LinkEvent、PingResult:用于事件通知;

6.測試

  • 單元測試模擬或?qū)嶋H運行環(huán)境中驗證接口查詢、事件訂閱及 Ping 探測;
  • 使用 CountDownLatch 等同步工具確?;卣{(diào)觸發(fā);

7. 項目詳細(xì)總結(jié)

功能齊全:支持接口狀態(tài)、地址變化事件訂閱,周期性網(wǎng)卡性能采集,Ping 連通性探測;

純 Java 集成:利用 JNA/JNI 實現(xiàn) Netlink 訂閱,無需外部腳本或命令;

可擴展:提供插件式接口,可接入 HTTP 探測、SNMP、ARP 檢測等更多模塊;

高性能:使用 NIO 和內(nèi)存映射、線程池并行,保證在高密度事件和大規(guī)模網(wǎng)絡(luò)環(huán)境下穩(wěn)定;

易用:Builder 模式配置簡潔,回調(diào)接口清晰,支持 Spring Boot Starter 及監(jiān)控端點集成。

8. 項目常見問題及解答

Q1:如何在非 Linux 環(huán)境下運行?

A1:Netlink 部分僅在 Linux 上支持,可在 Builder 中不啟用事件訂閱,StatsPoller 仍能通過 /proc/net/dev 采集部分信息。

Q2:NetlinkWatcher 解析性能如何?

A2:解析使用直接內(nèi)存 ByteBuffer,并在單獨線程中處理。對于高頻事件(如容器短暫創(chuàng)建),建議擴展批量處理或事件聚合。

Q3:如何切換到純 ICMP vs TCP Ping?

A3:在 PingProber 中替換探測邏輯,比如使用 Socket 連接指定端口代替 isReachable。

Q4:StatsPoller 如何處理大規(guī)模接口?

A4:當(dāng)前按序遍歷 /sys/class/net,在上萬接口場景下可擴展為分段并行讀取。

Q5:如何將指標(biāo)上報到 Prometheus?

A5:可在 StatsListener 中將 NetInterface 信息轉(zhuǎn)化為 Micrometer 指標(biāo)并注冊,或提供 Actuator /metrics 端點。

9. 擴展方向與性能優(yōu)化

HTTP 探針與 SNMP 支持:增加 HttpProber、SnmpProber 模塊,通過插件加載探測更多協(xié)議;

批量 Netlink 事件過濾:在內(nèi)核側(cè)設(shè)置過濾規(guī)則或在用戶態(tài)聚合事件,降低事件風(fēng)暴對應(yīng)用的沖擊;

異步非阻塞 I/O:使用 AsynchronousFileChannel 讀取 /proc/net/dev,并結(jié)合 CompletableFuture 實現(xiàn)完全異步統(tǒng)計;

Spring Boot Starter 集成:自動注入 LinuxNetMonitor Bean,并生成 /actuator/netmetrics 端點;

高可用與集群:在集群中部署 Agent 模式,將網(wǎng)絡(luò)狀態(tài)推送至中心 Collector,實現(xiàn)統(tǒng)一監(jiān)控與故障定位;

可視化儀表盤:集成 Grafana,通過 Prometheus 數(shù)據(jù)源實時展示網(wǎng)絡(luò)指標(biāo)與事件;

多平臺支持:在 BSD/macOS 環(huán)境下基于 sysctl 與 ifconfig 或 PF socket 實現(xiàn)類似功能,通過 SPI 插件切換實現(xiàn)。

以上就是java實現(xiàn)檢測Linux網(wǎng)絡(luò)狀態(tài)(附源碼)的詳細(xì)內(nèi)容,更多關(guān)于java檢測Linux網(wǎng)絡(luò)狀態(tài)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論