-3

Ich versuche, ein Bild von Client zu Server über Socket zu senden. Ich bin in der Lage, das Bild an Server-Verzeichnis zu senden, aber das Bild ist nicht voll. Was soll ich ändern?ImageIO schreiben nur laden die Hälfte des Bildes (Buchse)

Client-Code:

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();  
} 

Code 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) { 
    //... 
} 
} 

Dies ist das Bild geladen: enter image description here

Antwort

1

Sie gehen davon aus, dass read() den Puffer füllt. Sie benötigen DataInputStream.readFully().

Werfen Sie einen Blick auf DataOutputStream.writeInt(), während Sie gerade dabei sind.

Natürlich können Sie einfach ImageIO.read() direkt auf den Socket-Eingangsstrom und vermeiden Sie all dies und ebenso ImageIO.write() direkt auf den Socket-Ausgangsstrom. Aber wenn das Originalbild kein JPEG ist, sollten Sie nur Bytes kopieren, ohne ImageIO oder BufferedImage zu verwenden.

Verwandte Themen