Java 如何序列化ImageIcon对象?
我正在尝试构建一个客户机-服务器程序,其中服务器将图像发送给客户机,客户机在JFrame中显示接收到的图像。我正在将服务器端的图像转换为ImageIcon对象,并通过ObjectOutStream将其发送到客户端。但是它失败了,并且在服务器端出现了加载图像内容失败错误,这是在调用ObjectOutputStream.writeObject()方法时发生的 服务器端代码 只需给出图像文件的路径即可,用于测试。 客户端代码 在服务器端生成错误 这是从以下书籍中摘录的代码:Java 如何序列化ImageIcon对象?,java,swing,sockets,imageicon,objectoutputstream,Java,Swing,Sockets,Imageicon,Objectoutputstream,我正在尝试构建一个客户机-服务器程序,其中服务器将图像发送给客户机,客户机在JFrame中显示接收到的图像。我正在将服务器端的图像转换为ImageIcon对象,并通过ObjectOutStream将其发送到客户端。但是它失败了,并且在服务器端出现了加载图像内容失败错误,这是在调用ObjectOutputStream.writeObject()方法时发生的 服务器端代码 只需给出图像文件的路径即可,用于测试。 客户端代码 在服务器端生成错误 这是从以下书籍中摘录的代码: 好的,所以我使用Netbe
好的,所以我使用Netbeans创建了一个项目。我在名为
images
的包中放置了一个图像(名为29bd6417998561.5635a605ad357.png
)
我创建了服务器类
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
public class Server {
private static final int PORT = 9999;
public static void main(String[] args) {
System.out.println("Opening port…\n");
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
while (true) {
;
try {
System.out.println("Waiting for connection");
Socket connection = serverSocket.accept();
System.out.println("Read image...");
ImageIcon icon = new ImageIcon(ImageIO.read(Server.class.getResource("/images/29bd6417998561.5635a605ad357.png")));
System.out.println("Read image...");
try (ObjectOutputStream outStream = new ObjectOutputStream(connection.getOutputStream())) {
System.out.println("Write image");
outStream.writeObject(icon);
}
} catch (IOException ioEx) {
ioEx.printStackTrace();
}
}
} catch (IOException ioEx) {
System.out.println("Unable to attach to port!");
System.exit(1);
}
}
}
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Client {
private InetAddress host;
private final int PORT = 9999;
private ImageIcon image;
private JLabel label;
public static void main(String[] args) {
Client pictureFrame = new Client();
}
public Client() {
try {
host = InetAddress.getLocalHost();
} catch (UnknownHostException uhEx) {
System.out.println("Host ID not found!");
System.exit(1);
}
JFrame frame = new JFrame();
label = new JLabel();
frame.add(label);
System.out.println("Connect to server");
try (Socket connection = new Socket(host, PORT)) {
try (ObjectInputStream inStream = new ObjectInputStream(connection.getInputStream())) {
System.out.println("Read image");
image = (ImageIcon) inStream.readObject();
label.setIcon(image);
System.out.println("All done");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
} catch (IOException ex) {
ex.printStackTrace();
}
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
并创建了客户端
类
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
public class Server {
private static final int PORT = 9999;
public static void main(String[] args) {
System.out.println("Opening port…\n");
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
while (true) {
;
try {
System.out.println("Waiting for connection");
Socket connection = serverSocket.accept();
System.out.println("Read image...");
ImageIcon icon = new ImageIcon(ImageIO.read(Server.class.getResource("/images/29bd6417998561.5635a605ad357.png")));
System.out.println("Read image...");
try (ObjectOutputStream outStream = new ObjectOutputStream(connection.getOutputStream())) {
System.out.println("Write image");
outStream.writeObject(icon);
}
} catch (IOException ioEx) {
ioEx.printStackTrace();
}
}
} catch (IOException ioEx) {
System.out.println("Unable to attach to port!");
System.exit(1);
}
}
}
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Client {
private InetAddress host;
private final int PORT = 9999;
private ImageIcon image;
private JLabel label;
public static void main(String[] args) {
Client pictureFrame = new Client();
}
public Client() {
try {
host = InetAddress.getLocalHost();
} catch (UnknownHostException uhEx) {
System.out.println("Host ID not found!");
System.exit(1);
}
JFrame frame = new JFrame();
label = new JLabel();
frame.add(label);
System.out.println("Connect to server");
try (Socket connection = new Socket(host, PORT)) {
try (ObjectInputStream inStream = new ObjectInputStream(connection.getInputStream())) {
System.out.println("Read image");
image = (ImageIcon) inStream.readObject();
label.setIcon(image);
System.out.println("All done");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
} catch (IOException ex) {
ex.printStackTrace();
}
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
我启动了服务器
并运行了客户端
,它运行得很好
免责声明。。。
毫无疑问,其他人会指出此代码的固有问题,但这不是示例的重点
首先,您不应该在事件调度线程内执行阻塞或长时间运行的操作(例如连接到服务器和/或从服务器读取图像)。您也不应该在事件调度线程的上下文之外修改UI(这里有点安全,因为屏幕上没有显示帧,但仍然不是一个很好的示例)
在这两种情况下,类似于SwingWorker
的东西将有助于解决这些问题
查看更多详细信息我假设您实际上没有使用“//Give image path/”。如果是这样,那可能是您的问题。您已经测试过,在尝试发送图像之前,您确实成功地读取了图像,对吗?--看起来不像。我自己,我会通过ImageIO.read(…)获取图像
并首先测试它是否存在且不为空。此外,通常最好将图像作为资源而不是文件获取。图标。getImageLoadStatus
必须返回值MediaTracker.COMPLETE
,但由于这是加载图像的异步方法,因此不能保证返回完全完成的图像。Instead,使用ImageIO.read
,它要么失败并出现IOException
,要么返回一个完全实现的图像。请注意,返回一个URL
,客户端可以通过该URL下载图像,或者使用类似base64编码的方法。对象序列化只会导致更多问题@ck0049…请不要这样。我以这种方式使用ImageIcon
已经超过17年了,我保证它以这种方式工作。如果你看一下,你会发现它是从…java.awt.Image
@ck0049扩展而来的,那么问题是,图像在你认为的地方也不存在它存在或不是有效的图像格式。由于ImageIO
支持范围更广的图像格式,因此ImageIcon
,这可能会开始向您提示问题的部分根源。您实际尝试读取的图像类型是什么?现在一切正常。感谢您的帮助@MadProgrammer。
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Client {
private InetAddress host;
private final int PORT = 9999;
private ImageIcon image;
private JLabel label;
public static void main(String[] args) {
Client pictureFrame = new Client();
}
public Client() {
try {
host = InetAddress.getLocalHost();
} catch (UnknownHostException uhEx) {
System.out.println("Host ID not found!");
System.exit(1);
}
JFrame frame = new JFrame();
label = new JLabel();
frame.add(label);
System.out.println("Connect to server");
try (Socket connection = new Socket(host, PORT)) {
try (ObjectInputStream inStream = new ObjectInputStream(connection.getInputStream())) {
System.out.println("Read image");
image = (ImageIcon) inStream.readObject();
label.setIcon(image);
System.out.println("All done");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
} catch (IOException ex) {
ex.printStackTrace();
}
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}