Java文件传输中途卡住了

时间:2009-12-05 20:31:53

标签: java sockets file-transfer

我正在尝试向客户端发送文件(作为字节数组发送的图像),然后服务器应该接收所述字节数组以进一步使用它。然而,当我点击“发送”发送图像时,文件传输开始(因为我在桌面上得到了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 :(得分:0)

似乎没有用于写入磁盘的OutputStream(bos)被关闭。这可能会导致意想不到的结果。

答案 1 :(得分:0)

正如jt所说,写入磁盘的OutputStream没有被关闭,但是用于发送数据的OutputStream也没有被关闭,Socket也没有从发送端关闭。发送方可以在tcp级别缓冲数据,在发送最后一个数据包之前等待更多字节。你正在调用flush,但是可以忽略它,它不能保证像你期望的那样工作。另一件事是在Socket上调用shutdownOutput并查看是否强制它进行刷新。打开Socket时,也可以尝试setTcpNoDelay(true)。如果这些都不起作用,请获取tcp跟踪程序(我喜欢tcpdump)并使用它来查看数据包是否实际被发送,它至少会将其缩小到发送或接收端。