2017-03-07 72 views
-3

我試圖使用套接字將圖像從客戶端發送到服務器。我可以將圖像發送到服務器目錄,但發送的圖像不完整。 我應該改變什麼?ImageIO只寫入圖片的一半(套接字)

客戶端代碼:

Part filePart = request.getPart("file"); 
InputStream fileContent = filePart.getInputStream();   

Socket clientSocket = new Socket("localhost",51519); 
OutputStream outputStream = clientSocket.getOutputStream(); 
try {      
    BufferedImage image = ImageIO.read(fileContent); 

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    ImageIO.write(image, "jpg", byteArrayOutputStream); 

    byte[] size = ByteBuffer.allocate(4).putInt(byteArrayOutputStream.size()).array(); 

    outputStream.write(size); 
    outputStream.write(byteArrayOutputStream.toByteArray());     
} 
catch (SocketException ex){ 
    BLL_Common.write_log(ex.toString(), ""); 
} catch (IOException ex) { 
    BLL_Common.write_log(ex.toString(), ""); 
} finally { 
    outputStream.flush();  
} 

Server代碼:

String dir = "web/Admin/img/";  
ServerSocket serverSocket = new ServerSocket(51519); 

while(true) { 
try { 
    Socket socket = serverSocket.accept(); 

    InputStream inputStream = socket.getInputStream(); 

    byte[] sizeAr = new byte[4]; 
    inputStream.read(sizeAr); 
    int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get(); 
    byte[] imageAr = new byte[size]; 

    inputStream.read(imageAr); 
    BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageAr));     

    String fileName = String.valueOf(System.currentTimeMillis()); 

    ImageIO.write(image, "jpg", new File(dir + fileName + ".png")); 
} 
catch (SocketException ex) { 
    //... 
} catch (IOException ex) { 
    //... 
} 
} 

這是加載的圖像: enter image description here

回答

1

你假設read()填充緩衝區。您需要DataInputStream.readFully()

看一下DataOutputStream.writeInt()就可以了。

當然,您可以直接在套接字輸入流上直接使用ImageIO.read()並避免所有這些,並且類似地ImageIO.write()直接套接字輸出流。但是,除非原始圖像不是JPEG,否則應該只是複製字節,根本不使用ImageIOBufferedImage