Java - 通过 ObjectOutputStream 发送 ImageIcon 第一次有效,但之后就不行了
Java - Sending of ImageIcon through ObjectOutputStream works first time, but not after that
我正在 Java 中进行一个 server/client 项目,在该项目的 运行 期间,客户可以随时请求与某个项目相关的一组详细信息唯一 ID,以及服务器 returns 相关的一组详细信息。这是通过访问 socket.getOutputStream
的 PrintWriter
对象完成的,并且工作正常。
我也在尝试将图像的 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
}
}
因此,每次有请求时,都会创建一个 ObjectOutpuStream
和 ObjectInputStream
来处理图像的传递,使用 socket.getOutputStream
/socket.getInputStream
。
当客户端连接到服务器时首先调用这些方法,并自动发送第一张图像和一组详细信息。这工作正常,但在整个程序中请求图像的任何后续尝试都会导致满足 catch (IOException)
子句,并显示上面显示的错误消息。
我这辈子都弄不明白为什么它第一次能用,但之后就不行了。如果有人能指出我正确的方向,那就太好了!
谢谢,
马克
你应该只包装一次流。在这种情况下,您不能再次包装它,因为这不适用于对象流。
如果您仅将流包装一次,请在发送图像后调用 ObjectOutputStream.reset()
。如果你不这样做,它只会再次传递对对象的引用(并使用大量内存)
我正在 Java 中进行一个 server/client 项目,在该项目的 运行 期间,客户可以随时请求与某个项目相关的一组详细信息唯一 ID,以及服务器 returns 相关的一组详细信息。这是通过访问 socket.getOutputStream
的 PrintWriter
对象完成的,并且工作正常。
我也在尝试将图像的 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
}
}
因此,每次有请求时,都会创建一个 ObjectOutpuStream
和 ObjectInputStream
来处理图像的传递,使用 socket.getOutputStream
/socket.getInputStream
。
当客户端连接到服务器时首先调用这些方法,并自动发送第一张图像和一组详细信息。这工作正常,但在整个程序中请求图像的任何后续尝试都会导致满足 catch (IOException)
子句,并显示上面显示的错误消息。
我这辈子都弄不明白为什么它第一次能用,但之后就不行了。如果有人能指出我正确的方向,那就太好了!
谢谢, 马克
你应该只包装一次流。在这种情况下,您不能再次包装它,因为这不适用于对象流。
如果您仅将流包装一次,请在发送图像后调用 ObjectOutputStream.reset()
。如果你不这样做,它只会再次传递对对象的引用(并使用大量内存)