簡體   English   中英

使用Java從套接字的流中讀取多個流?

[英]read multiple streams from a stream of a socket using java?

有什么方法可以從打開的套接字流中隨機讀取字節嗎? 假設我已經在網站上打開了數據流。 傳統的Java類使我可以順序訪問數據。 就像一個鏈表。 我想隨機讀取數據,例如從數組的隨機位置讀取數據。 假設數據大小為2048 KB,我想用1個線程從0讀取到1204 KB,同時要使用另一個線程從1205到2048 KB讀取數據。

所以最重要的是,我想從網站的打開套接字中對數據讀取過程進行多線程處理。 該過程必須類似於Internet Download Manager。 如果可能的話,請給我一些教程鏈接。

無法使用多個線程從網站流中的隨機位置進行讀取。 數據作為線性流下降,沒有標准的方法可以在多個線程中到達流中的不同位置。 但是,多個線程可以一次下載不同的文件。

HTTPD協議確實支持Range:標頭,盡管我不確定有多少Web服務器支持該行為,例如Apache。 如果支持,服務器應使用以下標頭進行響應:

Accept-Ranges: bytes

然后,客戶端可以要求文件的特定偏移量/長度:

Range: bytes=21010-47021

這樣一來,您可以同時從不同范圍下載多個線程,但是除非您從多台服務器請求,否則我不確定這樣做如何加快下載速度。 您很可能會遇到磁盤和網絡限制。

來自套接字的數據順序到達。 您必須使用一些較大的緩沖來避免這種情況。

我認為您要問的是http標頭

Accept-Ranges: bytes
Range: bytes=0-8999

這將指示服務器僅發送一些文件。 然后,您將順序讀取流。

另請參見如何使用范圍標頭匯編文件?

編輯:示例

這似乎有效

public static void main(String[] args) throws MalformedURLException, IOException {
    URLConnection conn = new URL("http://ftp.debian.org/debian/dists/stable/Contents-i386.gz")
            .openConnection();
    conn.addRequestProperty("Accept-Ranges","bytes");
    conn.addRequestProperty("Range", "bytes=8000000-16000000");
    InputStream input = conn.getInputStream();
    List<String> serverranges = conn.getHeaderFields().get("Accept-Ranges");
    boolean ispartial = serverranges != null && serverranges.get(0).equals("bytes");
    byte[] b = new byte[1024];
    int l ;
    System.out.println(ispartial);
    while((l=input.read(b, 0, b.length))>0){
        // if isPartial=true, we have server support. We received partial file.
        //do stuff with b,l
    }
}

重要的是要注意,並非所有服務器都支持此功能,因此請檢查isPartial變量。 如果是假的。 服務器不支持部分范圍,將為您提供文件的開始。

您不能通過套接字隨機讀取。 原則上,您有兩種選擇:

  1. 讀取整個數據流,並將其放入緩沖區(例如,字節數組)。 將緩沖區暴露給每個線程。

  2. 獨立讀取每個線程中的整個數據流,讓每個線程忽略所有不應讀取的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM