Javafx передача данных с сокетом - PullRequest
0 голосов
/ 07 мая 2018

Я создал приложение javafx, которое передает данные с сервера на клиент. Когда я это написал, все было хорошо. Сегодня я решил добавить прогрессбар клиенту, чтобы увидеть прогресс. Но теперь он загружает только несколько байтов, а затем метод чтения зависает. Я прочитал много постов и пробовал разные решения, но ничего не помогло.

Сервер:

DataOutputStream out = new DataOutputStream(socket.getOutputStream());
        DataInputStream in = new DataInputStream(socket.getInputStream());

        if (!socket.isClosed()) {
            out.writeInt(Main.files.size());
            out.flush();
            for (File file : Main.files) {
                out.writeUTF(file.getAbsolutePath());
                out.writeLong(file.length());
                out.flush();
            }
        }

        new Thread(() -> {
            try {
                while (!socket.isClosed()) {
                    index = in.readInt();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();

        FileInputStream fis;
        BufferedInputStream bis;
        OutputStream os;
        while (!socket.isClosed()) {
            try {
                while (index == -1)
                {
                    Thread.sleep(1000);
                }
                File filepath = Main.files.get(index);
                index = -1;
                File myFile = new File(filepath.getAbsolutePath());
                byte[] mybytearray = new byte[(int) myFile.length()];
                fis = new FileInputStream(myFile);
                bis = new BufferedInputStream(fis);
                bis.read(mybytearray, 0, mybytearray.length);
                os = socket.getOutputStream();
                System.out.println("Sending " + filepath.getName() + "(" + mybytearray.length + " bytes)");
                os.write(mybytearray, 0, mybytearray.length);
                os.flush();
                System.out.println("Done.");
                os.close();
                bis.close();
                fis.close();
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }

Клиент:

progressBar.setProgress(0);

            Socket socket = new Socket(myIP.getIp(), myIP.getPort());
            DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataOutputStream.writeInt(selectedIndex);
            socket.close();

            downloadTask = new DownloadTask(Math.toIntExact(longVector.get(selectedIndex)), myIP);

            progressBar.progressProperty().unbind();
            progressBar.progressProperty().bind(downloadTask.progressProperty());

            downloadTask.setOnRunning(event12 -> System.out.println("Loading"));

            File finalFilepath = filepath;
            downloadTask.setOnSucceeded(event1 -> {
                try {
                    byte[] bytes = downloadTask.getValue();
                    FileOutputStream fos = new FileOutputStream(finalFilepath);
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    bos.write(bytes, 0, bytes.length);
                    bos.flush();
                    System.out.println("File " + filename + " downloaded (" + bytes.length + " bytes read)");
                    bos.close();
                    fos.close();
                    progressBar.progressProperty().unbind();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });

            new Thread(downloadTask).start();

            dataOutputStream.close();

Задача:

try {
        Socket socket = new Socket(myIP.getIp(), myIP.getPort());
        InputStream is = socket.getInputStream();
        int bread = is.read(mybytearray, 0, mybytearray.length);
        updateProgress(current, mybytearray.length);
        current = bread;

        while (bread > -1) {
            if (isCancelled())
                break;

            // HERE IT HANGS
            bread = is.read(mybytearray, current, (mybytearray.length - current)); 

            if (bread >= 0)
                current += bread;

            System.out.println("Downloaded: " + current + "/" + mybytearray.length + " bytes");
            updateProgress(current, mybytearray.length);
        }

        updateProgress(current, mybytearray.length);
        socket.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return mybytearray;

Клиентский вывод:

Loading
1/113152
Downloaded: 72/113152 bytes

Вывод на сервер:

Listening port 1998
Found client. Connecting..
Client /127.0.0.1 connected
java.io.EOFException
    at java.io.DataInputStream.readInt(DataInputStream.java:392)
    at com.irakliy01.server.EchoThread.lambda$run$0(EchoThread.java:51)
    at java.lang.Thread.run(Thread.java:748)
Found client. Connecting..
Client /127.0.0.1 connected
java.net.SocketException: Connection reset
    at 
java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:115)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
    at java.io.DataOutputStream.write(DataOutputStream.java:107)
    at java.io.DataOutputStream.writeUTF(DataOutputStream.java:401)
    at java.io.DataOutputStream.writeUTF(DataOutputStream.java:323)
    at com.irakliy01.server.EchoThread.run(EchoThread.java:42)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Found client. Connecting..
Client /127.0.0.1 connected
Found client. Connecting..
Client /127.0.0.1 connected
java.io.EOFException
    at java.io.DataInputStream.readInt(DataInputStream.java:392)
    at com.irakliy01.server.EchoThread.lambda$run$0(EchoThread.java:51)
    at java.lang.Thread.run(Thread.java:748)
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.net.SocketInputStream.read(SocketInputStream.java:224)
    at java.io.DataInputStream.readInt(DataInputStream.java:387)
    at com.irakliy01.server.EchoThread.lambda$run$0(EchoThread.java:51)
    at java.lang.Thread.run(Thread.java:748)

Исключение пишет, что проблема здесь:

new Thread(() -> {
            try {
                while (!socket.isClosed()) {
                    index = in.readInt();  // HERE
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
...