Перевод двоичный файл массив байтов, используя TCP в Java


Я пытаюсь передать двоичный файл с сервера на клиент блоками байтов за один раз. Тем не менее, у меня есть проблема, где он застрял на передаче 8kb. Размер файла обычно превышает 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 4

1 ответ:

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

Что вы подразумеваете под "Он застрял при передаче 8kb"? Какие-нибудь исключения происходят?