0

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

2 回答 2

0

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

于 2009-12-08T01:21:00.130 回答
0

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

于 2009-12-05T20:47:52.553 回答