Javax.ImageIO.IIO PNG图像数据异常



我正在用java实现一个服务器,它从android应用程序接收图像。基本上,它是从android模拟器接收图像,但不是从android设备。从android模拟器或android设备接收图像的所有过程都是在localhost上完成的。

这是我的服务器代码。

public class Server {
private static ServerSocket serverSocket;
private static Socket clientSocket;
private static InputStreamReader inputStreamReader;
private static BufferedReader bufferedReader;
private static String message;
private static byte[] image;
public static void main(String[] args) throws UnknownHostException, IOException {
    try {
        serverSocket = new ServerSocket(4000); // Server socket
    } catch (IOException e) {
        System.out.println("Could not listen on port: 4000");
    }
    System.out.println("Server started. Listening to the port 4000");
    while (true) {
        clientSocket = serverSocket.accept(); // accept the client connection
        inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
        bufferedReader = new BufferedReader(inputStreamReader); // get the client message
        DataInputStream inputFromClient = new DataInputStream(clientSocket.getInputStream());
        int count = inputFromClient.available();
        System.out.println(count);
        image = new byte[count];
        inputFromClient.readFully(image);
        final BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(image));
        ImageIO.write(bufferedImage, "jpg", new File("image.jpg"));
    }
}

异常

Exception in thread "main" javax.imageio.IIOException: Error reading PNG image data
at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1308)
at com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1577)
at javax.imageio.ImageIO.read(ImageIO.java:1448)
at javax.imageio.ImageIO.read(ImageIO.java:1352)
at server.Server.main(Server.java:39)
Caused by: java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at java.io.DataInputStream.readFully(DataInputStream.java:195)
at com.sun.imageio.plugins.png.PNGImageReader.decodePass(PNGImageReader.java:1092)
at com.sun.imageio.plugins.png.PNGImageReader.decodeImage(PNGImageReader.java:1196)
at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1301)
... 4 more
Java Result: 1

我收到了javax.imageiio.exception的异常,以防从android设备发送图像,但对于android模拟器来说,它运行良好。请帮帮我,谢谢。

您的主要问题位于这一行:

int count = inputFromClient.available();

它返回当时已经接收到的字节数。然而,在服务器端可能有更多字节等待传输。因此,当您尝试加载时,传输的图像会被截断/不完整。

您现在有两个选择:

  1. 在传输图像数据之前,发送一个包含数据长度的整数

  2. 如果只传输一个图像,则在写入图像后关闭客户端的流。在服务器端,您现在必须进行读取,直到到达流的末尾。

最新更新