让Java文件传输更高效

2024-02-27

我有两台无线计算机连接到 N 个无线路由器。每台 PC 的连接速度都在 108-150Mbps 之间。

理论上,在绝对最佳的条件下,我应该能够以 13.5MB/s 到 18.75MB/s 的速度传输。

第一台计算机(正在发送)使用非常快的 SSD,如果我没记错的话,速度约为 100MB/s。 CPU 使用率也保持在 20% 以下。

它在 656367 毫秒内发送了 1960273535 字节 (1.8GB)。即 2.8MB/s(108 兆比特中的 22 兆比特)。 当我打开任务管理器时,我发现只有 25-27% 的网络连接正在使用。

我正在寻找任何可以使传输更快(通过网络)的想法、建议或改进。我正在考虑在一个线程上缓冲磁盘上的文件并从另一个线程发送缓冲的数据,但我不确定这是否是一个好主意。 这是 SSCCE:

Host:

import java.io.*;
import java.net.*;


public class Host {


    public static void main(String[] args) throws IOException {
        
        
        ServerSocket servsock = new ServerSocket(15064);
        Socket sock = servsock.accept();
            long time = System.currentTimeMillis();

        OutputStream out = sock.getOutputStream();
        FileInputStream fileInputStream = new FileInputStream("C:\\complete.rar");

        byte [] buffer = new byte[64*1024]; 
        int bytesRead = 0;
        long totalSent = 0;
        
        while ( (bytesRead = fileInputStream.read(buffer)) != -1)
        {
            if (bytesRead > 0)
            {   
                out.write(buffer, 0, bytesRead);
                totalSent += bytesRead;
                System.out.println("sent " + totalSent);
            }   
        }
        
        sock.close();
        
        System.out.println("Sent " + totalSent + " bytes in "
                + (System.currentTimeMillis() - time) + "ms.");
        
    }
}

Client:

import java.io.*;
import java.net.*;

public class Client {

    public static void main(String[] args) throws Exception {
        Socket sock = new Socket("127.0.0.1", 15064);
        InputStream in = sock.getInputStream();
        FileOutputStream fileOutputStream = new FileOutputStream("output.rar");

        byte [] buffer = new byte[64*1024]; 
        int bytesRead = 0;

        while ( (bytesRead = in.read(buffer)) != -1)
            fileOutputStream.write(buffer, 0, bytesRead);
        sock.close();
        fileOutputStream.close();
    }
}

编辑:我尝试映射网络驱动器并通过该驱动器发送文件,Windows 的表现甚至更糟 - 2.35MB/s。根据映射网络驱动器比 FTP 更快,而且我也没有时间去玩和设置 FTP 服务器。

Edit2:更改计时器后,结果发现它通过 WiFi 以 3MB/s 的速度传输。我讨厌“理论”吞吐量。当我买东西时,我想知道它的真实性能。 事实证明,该代码确实受到 WiFi 速度的限制。不过,我仍然愿意接受建议。

编辑 3:在 100Mbps LAN 上运行该程序后,它成功以 11.8MB/s 的速度传输文件。考虑到最大传输速率为 12.5MB/s,这已经相当不错了。


速度为 2.8MB/s,速度缓慢不太可能与您的代码有任何关系。几乎可以肯定是由于无线网络无法达到理论吞吐量(可能是由于环境条件)。

测试情况是否如此很容易:只需对一个大的时间进行计时即可ftp or scp在相同的两台计算机之间传输文件并查看您所看到的吞吐量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让Java文件传输更高效 的相关文章

随机推荐

  • 理解主定理

    通用形式 T n aT n b f n 所以我必须将 n logb a 与 f n 进行比较 if n logba gt f n is case 1 and T n n logb a if n logba lt f n is case 2
  • Symbian 的不同版本

    我必须在 Symbian 中构建一个项目 我有一些困惑 并有一些与 Symbian 版本相关的问题 有什么区别Symbian 3 S60 3rd edition and S60 5th edition 从编码角度来看 与 Symbian 3
  • 为同一轴上的抽动设置不同的颜色

    是否可以在同一轴上使用不同颜色或样式的抽动 tics 0 1 1 5 2我想要0和2有色red or bold 非常适合multiplots其中有关于相同测量值的图 并且您希望在不同的图中标记 y 或 x 范围 但又不会使其过载太多 现在对
  • 只比较时间,不比较日期?

    我需要编写一个方法来检查是否Time now位于商店的营业时间和打烊时间之间 营业时间和营业时间被保存为 Time 对象 但我无法直接比较它 因为商店将营业时间保存在2012 2 2所以开放时间大概是这样的 2012 02 02 02 30
  • Passport.js 中的本地和 Google 策略:序列化用户时出现问题

    我一直试图理解为什么即使身份验证本身正在工作 我也无法让用户在经过身份验证后保持登录状态 我什至在这里发布了一个问题 Passport js 本地策略未进行身份验证 https stackoverflow com questions 515
  • Google 服务的 Android 版本冲突

    我已经为此搜索了很多解决方案 但没有一个适合我的具体情况 我在 Gradle Sync 上收到此错误 错误 任务 app processDebugGoogleServices 执行失败 请通过更新 google services 插件的版本
  • 如何直观地显示 java ResultSet?

    我正在寻找一种在屏幕上显示 java sql ResultSet 的方法 最好内置于java或swing中 如果这两个都没有一个简单的好方法 我会考虑 spring How 循环 ResultSet 的结果并将其放入 TableModel
  • 如何在 Google 电子表格中添加标题

    我在用gdata spreadsheet 3 0jar 用于在 Google 电子表格中输入数据 我在用 new ListEntry getCustomElements setValueLocal Header Name Value 但我不
  • 有没有一种简单的方法来扩展现有的激活函数?我的自定义 softmax 函数返回: 操作具有“无”梯度

    我想通过仅使用向量中的前 k 个值来实现使 softmax 更快的尝试 为此 我尝试为张量流实现一个自定义函数以在模型中使用 def softmax top k logits k 10 values indices tf nn top k
  • Angular 2 组件@Input 不起作用

    我一直试图将属性值传递到我的组件中 从我读到的一切看起来都是正确的 但它仍然不起作用 我的测试值以空值输出到屏幕和控制台 这是我的测试组件 import Component Input from angular2 angular2 Comp
  • 如何检查字符串是否是全语法?

    我想创建一个函数 它接受一个字符串作为输入 并检查该字符串是否是全语法 全语法是包含字母表中每个字母的一段文本 我编写了以下代码 该代码有效 但我正在寻找一种替代方法 希望是一种简短的方法 import string def is pang
  • 从 Python 中的 code.interact() 恢复代码执行

    在使用调试时打开交互式控制台后 code interact local locals 我怎样才能恢复代码执行 我已经检查了 代码 模块和搜索堆栈溢出的文档 但找不到任何内容 这与退出任何 Python 解释器会话的方式相同 发送文件结束字符
  • 电话号码格式应该是国际格式,iPhone中是否有用于电话号码验证的正则表达式

    电话号码应该是国际电话号码 用户必须输入带有国家 地区代码的完整电话号码 为此 我需要一个正则表达式来格式化电话号码 对于真正的正则表达式测试使用正则表达式套件精简版 http regexkit sourceforge net RegexK
  • 是否可以在 _LoginPartial.cshtml 中使用 @model ?

    我需要从我的数据库获取一些数据 LoginPartial cshtml 是否可以使用 model in LoginPartial cshtml 或者说它是如何完成的 就在 using WebApp Services然后直接从服务中检索数据
  • OpenCL 编译器预处理定义?

    我正在 Snow Leopard 上开发 OpenCL 代码 并且了解 OpenCL 即时编译是由 Clang LLVM 完成的 是否使用了 C 预处理器 有没有办法使用编译器设置预处理定义 存在哪些定义 我希望代码知道它是为 CPU 还是
  • Java 8 列表到嵌套映射

    我有一个班级名单A like class A private Integer keyA private Integer keyB private String text 我要转让aList嵌套Map映射于keyA and keyB 所以我创
  • 正则表达式的金钱

    I have asp TextBox保持货币价值 即 1000 1000 0 和 1000 00 由于俄罗斯标准 逗号是分隔符 What ValidationExpression我要使用适当的asp RegularExpressionVal
  • 如何指定 RTL 特定的可绘制对象

    我有几张从右到左看起来不同的图像 是否可以创建 rtl 特定的可绘制目录或文件名的一些 rtl 后缀以自动加载相关图像 看起来像 ldrtl 后修复 从 17 级添加 仅适用于布局目录 现在回答这个问题已经很晚了 但我想分享一个我刚刚发现的
  • 有人用 VS2010 RTM 编译 OverviewMargin 吗?

    由于我严重上瘾岩石卷轴 http www hanselman com blog IntroducingRockScroll aspx 我正在寻找一个替代品 https stackoverflow com questions 2672277
  • 让Java文件传输更高效

    我有两台无线计算机连接到 N 个无线路由器 每台 PC 的连接速度都在 108 150Mbps 之间 理论上 在绝对最佳的条件下 我应该能够以 13 5MB s 到 18 75MB s 的速度传输 第一台计算机 正在发送 使用非常快的 SS