当前位置: 首页 > 知识库问答 >
问题:

具有多个连接的下载文件

杜烨伟
2023-03-14

嗨,我想下载一个多java的文件。网套接字。我可以通过基本的get请求获取文件:

Socket socket = new Socket(serverName, 80);
DataOutputStream bw = new DataOutputStream(socket.getOutputStream());
bw.writeBytes("GET " + requestFileName + " HTTP/1.1\r\n");
bw.writeBytes("Host: " + serverName + ":80\r\n\r\n");
bw.flush();

DataInputStream in = new DataInputStream(socket.getInputStream());

OutputStream dos = new FileOutputStream(indexFileName);
byte[] buffer = new byte[2048];
while ((count = in.read(buffer)) != -1) {
    dos.write(buffer, 0, count);
    dos.flush();
}
dos.close();
socket.close();

这是完美的,但还不够,因为我希望使用多套接字。我可以通过请求HEAD获得头,这样我就可以只获得内容长度。现在我的计划是使用此代码创建线程。例如,如果我想下载一个有3个线程的文件;我将把内容长度除以3,然后用3个线程下载。(0-99) (100-199) (200-299) = 300300字节,然后我会加入部分,但我找不到并行文件下载的方法。我只需要在部分以下更改吗?

while ((count = in.read(buffer)) != -1) {
    dos.write(buffer, 0, count);
    dos.flush();
}

或者尝试从服务器请求文件大小范围?例如

  • 获取0-99字节的a.dat并将其放入a.dat.part1
  • 获取100-199字节的a.dat放入a.dat.part1
  • 获取200-299字节的a.dat放入a.dat.part1

共有1个答案

姜景辉
2023-03-14

假设目标HTTP服务器支持它,如果我是你,我会:

>

  • 启动类型为HEAD的初始请求,以仅获取我的文件的头,例如Content-Llong,而不是其实际内容。
  • 然后根据Content-Llong,在正确设置HTTP头Range的情况下,每个类型为GET的线程启动一个请求,以获取文件的子部分,因为知道Range: bytes=0-99将给出100的第一个字节。请注意,异常的HTTP代码将是206,而不是200,表明您收到了部分内容。

    然后,最后使用RandomAccessFile重建文件,以便能够在给定位置写入文件内容,同时知道您可以依靠setLength(long newLength)创建一个目标大小的空文件,以便能够使用每个线程的RandomAccessFile的专用实例同时写入文件内容。

  •  类似资料:
    • 问题内容: 我使用Python Requests库下载一个大文件,例如: 大文件的下载速度为每秒+-30 Kb,这有点慢。与bigfile服务器的每个连接都受到限制,因此我想建立多个连接。 有没有一种方法可以同时建立多个连接来下载一个文件? 问题答案: 您可以使用HTTP标头仅获取文件的一部分(此处已涵盖python)。 只需启动几个线程,并获取每个线程的不同范围,就可以完成;) 还要注意,并非每

    • 问题内容: 我想获得一些建议,我已经开始了一个新项目,以创建一个使用多个连接的Java下载加速器。我想知道如何最好地做到这一点。 到目前为止,我已经知道可以使用HttpUrlConnection并使用range属性,但是想知道执行此操作的有效方法。一旦我从多个连接下载了零件,我就必须加入零件,以便最终得到一个完全下载的文件。 提前致谢 :) 问题答案: 获取要下载的文件的 内容长度 。 *根据条件

    • 问题内容: 我正在使用标准的join命令来连接基于column1的两个排序文件。命令是简单的连接文件1文件2>输出文件。 但是,如何使用相同的技术加入3个或更多文件?join file1 file2 file3> output_file上面的命令给了我一个空文件。我认为sed可以帮助我,但我不太确定该怎么做? 问题答案: : 它仅适用于 两个 文件。 如果您需要加入三个,也许您可​​以先加入前两个

    • 问题内容: 我的MySQL数据库中有这些表: 通用表: Facebook表: 首席表: 基本上,常规表包含一些( 显然 )常规数据。基于generalTable.scenario,您可以在其他两个表中查找更多详细信息,这些表在某些熟悉的列中(例如,expiresAt),而在其他一些列中则不然。 我的问题是,如何仅通过一个查询就可以获取generalTable和正确的明细表的联接数据。 所以,我想这

    • 我正在尝试更新一个名为< code>incode_warrants的表,并将< code>warn_docket_no设置为< code>incode_violations表中的< code>viol_docket_no。 我在Postgres 9.3中有以下SQL查询,但当它触发时,我得到以下错误: 我更像是一个主动记录的人,所以我的原始SQL技能严重不足。我想知道是否有人可以帮助我指出正确的方

    • 问题内容: 我有一个表“ People”,主键为“ PersonID”,字段为“ Supervisor”。“ Supervisor”字段包含用于创建自我联接的“ PersonID”的外键。 我想创建一个sql查询,以返回所有以“ Me”(登录到数据库的PersonID)作为管理员的人,以及该列表上有人标记为管理员的任何人。本质上,我想在命令链中列出提供的PersonID下面的任何人。 问题答案: