При передаче файлов через TCP в Java, он не передает все изображение, даже если я укажу размер байта больше, чем изображение - PullRequest
0 голосов
/ 29 октября 2019

У меня есть модель клиентского сервера TCP, она работает и передает файлы по назначению. Однако, когда я открываю изображение, оно никогда не является полным изображением. Это половина или, может быть, чуть больше половины. Вот мой текущий код:

Получатель:

try {
        byte[] b = new byte[200000];
        Socket sr = new Socket("192.168.192.41", 30481);
        InputStream is = sr.getInputStream();
        FileOutputStream fos = new FileOutputStream("C:\\Users\\tproudfoot\\Desktop\\Photo.png");
        is.read(b, 0, 200000);
        fos.write(b, 0, 200000);
    } catch (Exception e) {
        e.printStackTrace();
    }

Отправитель:

try {
        File f = new File(Path);
        long size = f.length();
        System.out.println(size);
        ServerSocket s = new ServerSocket(30481);
        Socket sr = s.accept();
        FileInputStream fis = new FileInputStream(Path);
        byte[] b = new byte[200000];
        fis.read(b, 0, 200000);
        OutputStream os = sr.getOutputStream();
        os.write(b, 0, 200000);
    } catch (Exception e) {
        e.printStackTrace();
    }

Я установил размер байта в 200000, поэтому я знаю, что это не такподрезать фото. В классе отправителя у меня есть строка, которая определяет размер выбранного файла. Так что я знаю, что размер байта намного выше этого. Я также попытался установить точный размер файла в байтах, но это тоже не сработало

заранее спасибо

1 Ответ

0 голосов
/ 30 октября 2019

Если вы используете Java 9 или выше, вы можете использовать InputStream.transferTo(OutputStream out):

is.transferTo(fos);

Если вы используете более старую версию Java, вот исходный код transferTo метод:

public long transferTo(OutputStream out) throws IOException {
    Objects.requireNonNull(out, "out");
    long transferred = 0;
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    int read;
    while ((read = this.read(buffer, 0, DEFAULT_BUFFER_SIZE)) >= 0) {
        out.write(buffer, 0, read);
        transferred += read;
    }
    return transferred;
}

MAX_BUFFER_SIZE равен 8192.
В основном вы должны делать то же самое в то время как цикл while. Возможно, вам не нужно считать переданные байты, поэтому вы можете не указывать это.

Итак, оба ваших примера будут выглядеть так:

try {
    Socket sr = new Socket("192.168.192.41", 30481);
    InputStream is = sr.getInputStream();
    FileOutputStream fos = new FileOutputStream("C:\\Users\\tproudfoot\\Desktop\\Photo.png");
    byte[] buffer = new byte[8192];
    while ((read = is.read(buffer, 0 buffer.length)) >= 0) {
        fos.write(buffer, 0, read);
    }
} catch (Exception e) {
    e.printStackTrace();
}

и

try {
    File f = new File(Path);
    long size = f.length();
    System.out.println(size);
    ServerSocket s = new ServerSocket(30481);
    Socket sr = s.accept();
    FileInputStream fis = new FileInputStream(Path);
    OutputStream os = sr.getOutputStream();
    byte[] buffer = new byte[8192];
    int read;
    while ((read = fis.read(buffer, 0, buffer.length)) >= 0) {
        os.write(buffer, 0, read);
    }
} catch (Exception e) {
    e.printStackTrace();
}
...