-4

次のコードを使用して、url.openconnection(); ではなくソケットを使用して、指定された URL からファイルをダウンロードします。ダウンロード後、チェックしたときに動作していませんでした...エディターでファイルを開くと、ファイル内のデータが完全に空白でした(空のファイル)提案が必要です???... ... ...

try {

    String address="http://tineye.com/images/widgets/mona.jpg";
    URL url_of_file=new URL(addres);
    String hostaddress=url_of_file.getHost();
    Socket mysocket=new Socket(hostaddress, 80);
    System.out.println("Socket opened to " + hostaddress + "\n");
    String file=url_of_file.getFile();
    System.out.println(" file = "+file);

    OutputStreamWriter osw=new OutputStreamWriter(mysocket.getOutputStream());

    osw.write("GET " + file + " HTTP/1.0\r\n\n"); 
    osw.flush(); 

    dis = new DataInputStream(mysocket.getInputStream());
    fileData = new byte[7850];

    for (int x = 0; fileData[x] > 0; x++){
         fileData[x] = (byte) dis.read();
    }

     // close the data input stream
    fos = new FileOutputStream(new File("C:\\Users\\down-to\\filedownloaded.jgp"));  //create an object representing the file we want to save
    fos.write(fileData);  // write out the file we want to save.
    dis.close();
    fos.close();

} catch (UnknownHostException ex) {
    Logger.getLogger(Check.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
    Logger.getLogger(Check.class.getName()).log(Level.SEVERE, null, ex);
} 
4

5 に答える 5

5

これは:

for(int x=0;fileData[x]>0;x++){

右 ?ストリームのコンテンツに基づいて中断しようとしているようです。フラビオが示したように、配列が新しく作成されてから、このステートメントはすぐに偽になります。

コンテンツの指定された長さ、またはストリームの最後に到達するまで読む可能性がはるかに高いと思います。

実際、私はむしろ既存のHttpClientを使用して、上記のすべてをバイパスしたいと考えています。信頼性の高い HTTP コードを記述することは、一見するとそれほど簡単ではありません。サード パーティのライブラリを使用すると、多くの手間を省くことができます。

于 2012-07-26T09:04:56.790 に答える
1

あなたはいくつか間違ったことをしています。まず第一に、多くの HTTP ライブラリが既に存在するため、車輪の再発明です。

次に、無効な HTTP リクエストを作成しています。HTTP 1.1 と同様に、このようなリクエストのヘッダーは で終了する必要が\r\nありますが、送信するのは\n:

osw.write("GET " + file + " HTTP/1.0\r\n\n"); 

サーバーはおそらく、リクエストが終了するまで待機するか ( double で終了する完全なリクエストを待機して\r\nいます)、2 番目のリクエストを想定していないため、エラーをスローします\n

次に、応答ヘッダーを読み取っていません。これは、予想されるデータの量を示している可能性があります。ちょうど十分な大きさのバイト配列を初期化するのは面白いですが (ダウンロードするファイルは 7850 バイトです)、Web 上のすべてのファイルのファイル サイズをハードコードすることはできません。彼ら。

したがって、Content-lengthヘッダーを読み取って解析するか、サーバーがすべてのデータを送信した後に接続を閉じるのを待ちます (これらはHTTP 1.0の 2 つのオプションです)。

最後に、他の人が指摘したように、応答を正しく読んでいません。これらの基本を修正してから、応答を保存してみてください。これで、ファイルがゼロで埋められました。

于 2012-07-26T09:52:18.677 に答える
0

この状態は正しいですか?はいの場合、この状態の背後にある意味は何ですか?

for(int x=0;fileData[x]>0;x++)
于 2012-12-24T13:22:08.823 に答える
0

for条件の意味は何ですか?

for(int x=0;fileData[x]>0;x++){

fileData 配列は作成されたばかりなので、ゼロで埋められます。fileData[x]>0すぐに偽です。

于 2012-07-26T09:03:48.783 に答える
0

以下のようにコードを変更することで、ファイルにデータを入力することができました。これが得られたものです。

エラー: アクセスが拒否されました

エラー

アクセスが拒否されました


  • セキュリティ ポリシーによりアクセスが拒否されました

ネットワークのセキュリティ ポリシーにより、現時点ではリクエストが許可されません。これが正しくないと思われる場合は、管理者に連絡してください。

try {
    String address = "http://tineye.com/images/widgets/mona.jpg";
    URL url_of_file = new URL(address);
    String hostaddress = url_of_file.getHost();
    Socket mysocket = new Socket(hostaddress, 80);
    System.out.println("Socket opened to " + hostaddress + "\n");
    String file = url_of_file.getFile();
    System.out.println(" file = " + file);

    OutputStreamWriter osw = new OutputStreamWriter(mysocket.getOutputStream());

    osw.write("GET " + file + " HTTP/1.0\r\n\n");
    osw.flush();

    DataInputStream dis = new DataInputStream(mysocket.getInputStream());
    byte[] fileData = new byte[7850];
    FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\aboutros\\Desktop\\filedownloaded.jgp")); // create an object representing the file we want to save

    while (dis.read(fileData) >= 0) {
        fos.write(fileData); // write out the file we want to save.
    }
    dis.close();
    fos.close();

} catch (UnknownHostException ex) {
    ex.printStackTrace();
} catch (IOException ex) {
    ex.printStackTrace();
}
于 2012-07-26T09:15:29.100 に答える