Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何序列化ImageIcon对象?_Java_Swing_Sockets_Imageicon_Objectoutputstream - Fatal编程技术网

Java 如何序列化ImageIcon对象?

Java 如何序列化ImageIcon对象?,java,swing,sockets,imageicon,objectoutputstream,Java,Swing,Sockets,Imageicon,Objectoutputstream,我正在尝试构建一个客户机-服务器程序,其中服务器将图像发送给客户机,客户机在JFrame中显示接收到的图像。我正在将服务器端的图像转换为ImageIcon对象,并通过ObjectOutStream将其发送到客户端。但是它失败了,并且在服务器端出现了加载图像内容失败错误,这是在调用ObjectOutputStream.writeObject()方法时发生的 服务器端代码 只需给出图像文件的路径即可,用于测试。 客户端代码 在服务器端生成错误 这是从以下书籍中摘录的代码: 好的,所以我使用Netbe

我正在尝试构建一个客户机-服务器程序,其中服务器将图像发送给客户机,客户机在JFrame中显示接收到的图像。我正在将服务器端的图像转换为ImageIcon对象,并通过ObjectOutStream将其发送到客户端。但是它失败了,并且在服务器端出现了加载图像内容失败错误,这是在调用ObjectOutputStream.writeObject()方法时发生的

服务器端代码 只需给出图像文件的路径即可,用于测试。

客户端代码 在服务器端生成错误 这是从以下书籍中摘录的代码:

好的,所以我使用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);
    }
}