Передача двоичного файла байтовым массивом с использованием TCP в Java - PullRequest
4 голосов
/ 06 февраля 2012

Я пытаюсь передать двоичный файл с сервера на клиент по блокам за раз. Тем не менее, у меня есть проблема, где он застрял при передаче 8 КБ. Файл обычно больше 1 МБ, а байтовый массив имеет размер 1024. Я считаю, что он должен что-то делать с моим циклом while, поскольку он не закрывает мое соединение. Любая помощь? Спасибо

Клиент

import java.io.*;
import java.net.Socket;

public class FileClient {

    public static void main(String[] argv) throws IOException {
        Socket sock = new Socket("localhost", 4444);
        InputStream is = null;
        FileOutputStream fos = null;

        byte[] mybytearray = new byte[1024];
        try {
            is = sock.getInputStream();
            fos = new FileOutputStream("myfile.pdf");

            int count;
            while ((count = is.read(mybytearray)) >= 0) {
                fos.write(mybytearray, 0, count);
            }
        } finally {
            fos.close();
            is.close();
            sock.close();
        }
    }
}

Сервер

import java.net.*;
import java.io.*;

public class FileServer {

    public static void main(String[] args) throws IOException {
        ServerSocket servsock = new ServerSocket(4444);
        File myFile = new File("myfile.pdf");
        FileInputStream fis = null;
        OutputStream os = null;
        while (true) {
            Socket sock = servsock.accept();
            try {
            byte[] mybytearray = new byte[1024];
            fis = new FileInputStream(myFile);
            os = sock.getOutputStream();

            int count;
            while ((count = fis.read(mybytearray)) >= 0) {
                os.write(mybytearray, 0, count);

            }
            os.flush();
            } finally {
            fis.close();
            os.close();
            sock.close();

            System.out.println("Socket closed");
            }
        }
    }
}

1 Ответ

3 голосов
/ 06 февраля 2012

Ваши циклы должны проверять count >= 0, а не count > 0, а потоки и сокет должны быть закрыты в блоке finally. Кроме этого, код выглядит хорошо для меня.

Что вы подразумеваете под "застревание при передаче 8 КБ"? Возникло ли исключение?

...