Передача файлов Java застряла на полпути - PullRequest
0 голосов
/ 05 декабря 2009

Я пытаюсь отправить файл (изображение, отправленное в виде байтового массива) клиенту, а затем сервер должен получить указанный байтовый массив для дальнейшего его использования. Однако, когда я нажимаю «отправить», чтобы отправить изображение, начинается передача файла (когда я получаю файл sentImage.jpg на рабочем столе), но по какой-то причине он застревает, я не могу понять, и изображение никогда не отправляется правильно.

Вот часть, которая получает от сервера (он уже принял соединение):

 public void run(){
   try {
          byte[] receivedData = new byte[1024];
          BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
         // while(bis.read() != -1){
          s.acquireUninterruptibly();
          BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Admin\\Desktop\\sentImage.jpg"));
          while ((incoming = bis.read(receivedData)) != -1) {
              bos.write(receivedData, 0, incoming);
          }
          s.release();
          n.release();
          bis.close();
          bos.flush();
        // }
      } catch (IOException e) {
          e.printStackTrace();
      }
}

и клиент отправляет сюда:

public void sendImageResult() {
            new Thread(new Runnable() {
                public void run() {
                    try {
                        int inside = 0;

                        Socket socket = new Socket("localhost", 4444);

                        File myImageFile = new File("C:\\Users\\Admin\\Desktop\\test.jpg");
                        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myImageFile));
                        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream( ));
                        byte[] byteArray = new byte[1024];
                        while ((inside = bis.read(byteArray)) != -1){
                            bos.write(byteArray,0,inside);
                        }
                        bis.close();
                        bos.flush();
                    } catch (UnknownHostException ex) {
                        System.out.println("No se pudo establecer la conexión.");
                        ex.printStackTrace();
                    } catch (FileNotFoundException fnf){
                        fnf.printStackTrace();
                    } catch(IOException ioe){
                        ioe.printStackTrace();
                    }

                }
            }).start();
        }

Ответы [ 2 ]

0 голосов
/ 08 декабря 2009

Как сказал jt, запись OutputStream на диск не закрывается, но и OutputStream не используется для отправки данных, а также сокет не закрывается со стороны отправки. Отправляющая сторона может буферизовать данные на уровне tcp, ожидая большего количества байтов перед отправкой последнего пакета. Вы вызываете флеш, но это можно игнорировать, ведь работа не гарантируется, как вы ожидаете. Еще одна вещь, которую стоит попробовать - вызвать shutdownOutput на Socket и посмотреть, заставляет ли он его сбрасываться. Вы также можете попробовать setTcpNoDelay (true) при открытии сокета. Если ничего из этого не работает, найдите программу трассировки tcp (мне нравится tcpdump) и используйте ее, чтобы увидеть, действительно ли отправляются пакеты, она, по крайней мере, сузит ее до конца отправки или получения.

0 голосов
/ 05 декабря 2009

Не похоже, что OutputStream (bos), который используется для записи на диск, закрывается. Это может привести к неожиданным результатам.

...