在 Java 中测试网络带宽(通常指出入网速率,单位 Mbps / MB/s),常见做法分为 应用层测试 和 系统/底层测试 两类。下面按“实用程度”给你系统说明。
原理:
发送/接收固定大小数据 → 记录时间 → 计算速率
Socket socket = new Socket("127.0.0.1", 9000);
InputStream in = socket.getInputStream();
byte[] buf = new byte[8192];
long total = 0;
long start = System.currentTimeMillis();
while (true) {
int len = in.read(buf);
if (len == -1) break;
total += len;
if (System.currentTimeMillis() - start > 5000) break;
}
long end = System.currentTimeMillis();
double seconds = (end - start) / 1000.0;
double mbps = (total * 8.0) / (seconds * 1024 * 1024);
System.out.println("带宽: " + mbps + " Mbps");
⚠️ 注意:
- TCP 有拥塞控制
- 本机 loopback 不能代表真实网络
- 多线程 / 多连接更准确
ExecutorService pool = Executors.newFixedThreadPool(4);
// 每个线程建立 Socket 并传输数据
适合:
URL url = new URL("http://speedtest.file");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream in = conn.getInputStream();
byte[] buf = new byte[8192];
long total = 0;
long start = System.currentTimeMillis();
int len;
while ((len = in.read(buf)) != -1) {
total += len;
}
long seconds = (System.currentTimeMillis() - start) / 1000.0;
System.out.println("下载速度: " + (total / 1024 / 1024 / seconds) + " MB/s");
# 服务端
iperf -s
# 客户端
iperf -c server_ip -t 10
Java 可调用:
Runtime.getRuntime().exec("iperf -c 192.168.1.10 -t 10");
✅ 优点:
SystemInfo si = new SystemInfo();
NetworkIF[] nets = si.getHardware().getNetworkIFs();
for (NetworkIF net : nets) {
System.out.println(net.getName());
System.out.println("接收: " + net.getBytesRecv());
System.out.println("发送: " + net.getBytesSent());
}
适合:
| 因素 | 说明 |
|---|---|
| TCP 窗口 | 默认较小 |
| 单线程 | 无法跑满带宽 |
| GC | 影响计时 |
| 防火墙 | 限速 |
| 云厂商 | 有突发限制 |
| 场景 | 推荐方案 |
|---|---|
| 快速验证 | Java Socket |
| 精确测速 | iperf |
| 下载测速 | HTTP 下载 |
| 监控 | OSHI |
| 压测 | 多线程 Socket |
如果你愿意,我可以:
你现在是想测 本机 / 局域网 / 公网 带宽?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。