Java - 通过 ObjectOutputStream 发送 ImageIcon 第一次有效,但之后就不行了

Java - Sending of ImageIcon through ObjectOutputStream works first time, but not after that

我正在 Java 中进行一个 server/client 项目,在该项目的 运行 期间,客户可以随时请求与某个项目相关的一组详细信息唯一 ID,以及服务器 returns 相关的一组详细信息。这是通过访问 socket.getOutputStreamPrintWriter 对象完成的,并且工作正常。

我也在尝试将图像的 sending/receiving 从服务器包含到客户端,并且在程序中遇到了一些非常奇怪的行为。

发送和接收图片的方法如下:

服务器端:

//send image associated with item
//through ObjectOutputStream to client
private void sendItemImage(BidItem item)
{
    try
    {
        //wrap object output stream around
        //output stream to client at this socket
        ObjectOutputStream imageOutput =
                new ObjectOutputStream(client.getOutputStream());
        //send image object to client
        imageOutput.writeObject(item.getItemImage());
    }
    catch (IOException ioEx)
    {
        //alert server console
        System.out.println("\nUnable to send image for item "
                        + item.getItemCode() + " to "
                        + bidderName + "!");
        //no exit from system
        //bidding can still continue
    }
}

客户端:

//to be displayed on GUI
private static void receiveItemImage()
{
    try
    {
        //wrap ObjectInputStream around socket
        //to receive objects sent from server
        ObjectInputStream imageInput =
                new ObjectInputStream(socket.getInputStream());
        //read in image and store in ImageIcon instance
        image = (ImageIcon) imageInput.readObject();

        //re-create label object to be blank
        imageLabel = new JLabel();
        //remove label containing last image
        imagePanel.remove(imageLabel);
        //just ignores command if it does not already contain image

        //apply image to label
        imageLabel.setIcon(image);
        //apply image to CENTER of panel
        imagePanel.add(imageLabel, BorderLayout.CENTER);
    }
    //problem in input stream
    catch (IOException ioEx)
    {
        //alert user
        JOptionPane.showMessageDialog(
                null, "Error receiving image!");
        //allow system to continue
        //no exit
    }
    //problem casting to ImageIcon type
    catch (ClassNotFoundException cnfEx)
    {
        //alert user
        JOptionPane.showMessageDialog(
                null, "Error converting Object to ImageIcon!");
        //allow system to continue
        //no exit
    }
}

因此,每次有请求时,都会创建一个 ObjectOutpuStreamObjectInputStream 来处理图像的传递,使用 socket.getOutputStream/socket.getInputStream

当客户端连接到服务器时首先调用这些方法,并自动发送第一张图像和一组详细信息。这工作正常,但在整个程序中请求图像的任何后续尝试都会导致满足 catch (IOException) 子句,并显示上面显示的错误消息。

我这辈子都弄不明白为什么它第一次能用,但之后就不行了。如果有人能指出我正确的方向,那就太好了!

谢谢, 马克

你应该只包装一次流。在这种情况下,您不能再次包装它,因为这不适用于对象流。

如果您仅将流包装一次,请在发送图像后调用 ObjectOutputStream.reset()。如果你不这样做,它只会再次传递对对象的引用(并使用大量内存)