具有范围的Java套接字获取请求
我试图下载一个多线程文件,通过为每个线程定义一个范围来发送get请求。我在发送head请求后获得内容长度,并将其划分为线程数。假设长度是1587,当我有两条线时,我把它分成了794和793两部分。这是我的代码:具有范围的Java套接字获取请求,java,multithreading,sockets,http,Java,Multithreading,Sockets,Http,我试图下载一个多线程文件,通过为每个线程定义一个范围来发送get请求。我在发送head请求后获得内容长度,并将其划分为线程数。假设长度是1587,当我有两条线时,我把它分成了794和793两部分。这是我的代码: threads[i] = new Thread() { public void run() { try { Socket sock = new Socket(host, 80
threads[i] = new Thread() {
public void run() {
try {
Socket sock = new Socket(host, 80);
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(sock.getOutputStream()));
writer.write("GET " + fileName + " HTTP/1.1 \r\nHost: "
+ host + "\r\nRange: bytes=" + newPart[j] + "-"
+ newPart[j + 1] + "\r\n\r\n");
writer.flush();
DataInputStream is = new DataInputStream(
sock.getInputStream());
byte[] buffer = new byte[newPart[j + 1] - newPart[j]
+ 1];
int count = 0;
int offset = newPart[j];
while ((count = is.read(buffer)) != -1) {
System.out.println("Count: " + count);
System.out.println("offset: " + offset);
oss[j].seek(newPart[j]);
oss[j].write(buffer, 0, count);
offset +=count;
}
System.out.println();
sock.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
获取文件后,我想同时写入本地文件。但我有个问题。我期待有794和793大小的2个字节块。但控制台中的输出(尝试写入文件时的偏移量和计数)如下所示:
Count: 794
offset: 0
Count: 324
offset: 794
Count: 794
offset: 793
Count: 327
offset: 1587
新部件阵列可容纳[07941587]
我不知道这324和327是什么。由于这个原因,我不能正确地写入文件。你能帮我吗
编辑:正如我所理解的,这些额外的324和327是标题。那么,是否只获取文件的正文而不获取头
谢谢
正如我所理解的,这些额外的324和327是标题。那么,是否只获取文件的正文而不获取头
不,如果您使用超文本传输协议,则不会,因为标头是HTTP的一部分。这没有多大意义。网络不是多线程的。我得到了结果。但问题是,即使内容长度返回1587,我从第一个线程获得(794+324)字节,从另一个线程获得(793+327)字节。这是因为网络不是多线程的吗?不,这是因为您的代码中有一个bug。没有多线程的网络意味着使用两个线程和两个连接不会获得双倍的吞吐量。您和目标之间的带宽在连接之间分配。