You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Socket跨网传输限速但局域网不限速问题排查

Java Socket ObjectStream 跨网传输速度异常受限问题

我实现了一个基于Java Socket的基础文件传输功能,测试发现:

  • 在局域网(1Gbps连接)中传输速度可达约110MB/s,已达网络上限;
  • 切换至互联网连接后,速度被限制在3-3.5MB/s,但其他应用(如Google Drive Windows客户端)无此限制,传输速度能超过40MB/s。

测试截图说明:

  • 局域网传输速度截图:任务管理器显示速度约110MB/s
  • 互联网传输速度截图:任务管理器显示速度3-3.5MB/s
  • Google Drive传输速度截图:任务管理器显示速度超40MB/s

服务端代码

ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
File file = new File(
        System.getProperty("user.dir") + "\\" + ThreadLocalRandom.current().nextInt(0, 5000000) + ".dat");
while (file.exists()) {
    file = new File(System.getProperty("user.dir") + "\\" + ThreadLocalRandom.current().nextInt(0, 5000000)
            + ".dat");
}
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
Object auxKeepReading = dataIn.readObject();
if (auxKeepReading instanceof Boolean) {
    while ((boolean) auxKeepReading) {
        Object auxSize = dataIn.readObject();
        if (!(auxSize instanceof Integer)) {
            break;
        }
        Object auxBuffer = dataIn.readObject();
        if (!(auxBuffer instanceof byte[])) {
            break;
        }
        bos.write((byte[]) auxBuffer, 0, (int) auxSize);
        auxKeepReading = dataIn.readObject();
        if (!(auxKeepReading instanceof Boolean)) {
            break;
        }
    }
}
bos.close();
dataIn.close();
dataOut.close();
socket.close();

客户端代码

Socket socket = new Socket("IP", 40001);
ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());
BufferedInputStream is = new BufferedInputStream(
        new FileInputStream(new File(System.getProperty("user.dir") + "\\Test.dat")));
byte[] buffer = new byte[8192];
int sizeRead = 0;
while ((sizeRead = is.read(buffer, 0, 8192)) >= 0) {
    dataOut.writeObject(true);
    dataOut.writeObject(sizeRead);
    dataOut.writeObject(Arrays.copyOf(buffer, sizeRead));
    dataOut.flush();
    buffer = new byte[8192];
}
is.close();
dataOut.writeObject(false);
dataOut.flush();
dataIn.close();
socket.close();

因业务需求需传输其他对象,故使用ObjectStream。最初排除ISP限制可能(其他应用无此问题),请问该传输限速的原因是什么?

补充测试:使用qBittorrent创建种子跨网下载,速度同样仅不足3MB/s,现怀疑ISP对部分上传类型限速,将联系ISP确认。

内容的提问来源于stack exchange,提问作者user21967510

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:55:15