Почему два файла не должны быть равны, не равны? Я загружаю файл с помощью Java Socket и сравниваю его с тем же файлом, который загружен с помощью Mozilla - PullRequest
2 голосов
/ 26 декабря 2010

Я загружаю файл с помощью Java Socket.Код предназначен только для проверки, равны ли файлы или нет.Это часть большого проекта.

import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Arrays;


public class Compare {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
    Socket sk = null;
    try
    {
          sk = new Socket("wlab.cs.bilkent.edu.tr", 80);
          if (sk.isConnected())
          {

              PrintWriter out = new PrintWriter(sk.getOutputStream(),true);
              out.println("GET /" + "/PA2/test5MB.bin" + " HTTP/1.1");
              out.println("Host: " + 80);
             // out.println("Range: " + 0 + '-' + 5242879);
              out.println("Connection: close\r\n");
              out.println("");
              out.flush();

          }
          }catch(Exception e){

          }


    // receive file
    byte [] mybytearray  = new byte [5242880]; // when i use HEAD, this size is returned.

   // FileInputStream is = new FileInputStream("C:\\Users\\Eda\\workspace\\network1\\t1est5MB.bin");
    InputStream is = sk.getInputStream(); //when I used this one, the files don't match, but the above declaration works.

    FileOutputStream fos = new FileOutputStream( new File ("C:\\Users\\Eda\\workspace\\network1\\tesst5MB.bin"));
    BufferedOutputStream bos = new BufferedOutputStream(fos);


    int offset3 = 0;
    int numRead3 = 0;
    System.out.println("1 in length: " +mybytearray.length);

  while(offset3 < mybytearray.length
            && (numRead3=is.read(mybytearray, offset3, mybytearray.length-offset3)) >= 0  )


    {
        offset3 += numRead3;
      //  is=sk.getInputStream();
    }
    bos.write(mybytearray);
    is.close();

    bos.close();

    //rest is for comparing two binary files.works except for the file I downloaded in this code above.
    try{
        File filename=new File("C:\\Users\\Eda\\workspace\\network1\\tesst5MB" +".bin");
        File filename2=new File("C:\\Users\\Eda\\workspace\\network1\\t1est5MB" +".bin");
        if(filename.exists() && filename2.exists())
            System.out.println("both exists");

        int size = (int)filename.length(); 
        System.out.println("size1: " + size);
        byte[] byteArray1 = new byte[size];
        size = (int)filename2.length(); 

        System.out.println("size2: " + size);
        byte[] byteArray2 = new byte[size];

        DataInputStream infile1 = new DataInputStream(new FileInputStream(filename));


        DataInputStream infile2 = new DataInputStream(new FileInputStream(filename2));


        int offset1 = 0;
        int numRead1 = 0;


        int offset2 = 0;
        int numRead2 = 0;
        System.out.println("1 in length: " +byteArray1.length);

      while(offset1 < byteArray1.length
                && (numRead1=infile1.read(byteArray1, offset1, byteArray1.length-offset1)) >= 0)


        {
            offset1 += numRead1;

        }

        infile1.close();


        while(offset2 < byteArray2.length
                && (numRead2=infile2.read(byteArray2, offset2, byteArray2.length-offset2)) >= 0)


        {
            offset2 += numRead2;

        }

        infile2.close();


        System.out.println(Arrays.equals(byteArray1,byteArray2));
    }
    catch(Exception e){

    }       

}

}

Когда я копирую файл, читая его побайтно и сравнивая, они равны.Но когда я загружаю файл через Socket и сравниваю его с файлом, который я загружаю с Mozilla (они должны быть равными), они не равны.Я не знаю, что не так с моим sk.getInputStream ().Я застрял здесь.Можете ли вы сказать мне, как?Я не знаю что делатьОни просто не равны, и я не знаю почему.Размер файла, который я дал, - это размер файла, когда я использовал запрос HEAD.5 МБ

1 Ответ

3 голосов
/ 26 декабря 2010

Когда вы соединяетесь с необработанным сокетом, вы получите HTTP-заголовки, которые вам нужно проанализировать, а не сохранить в выходной файл.Реальные данные начинаются после того, как вы видите две новые строки подряд, указывающие конец заголовков.Вы должны читать Content-length из заголовков, а не жестко кодировать.

Если вы откроете загруженный файл (тот, который вы создали с помощью Socket), вы увидите эти заголовки HTTP.

Если это подразумевается как производственный код (не просто игра или разовая сделка), вы не должны использовать Socket для HTTP.HTTP намного сложнее, чем вы реализовали здесь.По крайней мере, вы должны проверить код результата, чтобы убедиться, что вы получили 200.

Взгляните на java.net.URLConnection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...