Java-通过套接字发送指向BuffereImage的对象

Java-通过套接字发送指向BuffereImage的对象,java,sockets,bufferedimage,serializable,Java,Sockets,Bufferedimage,Serializable,我和一群朋友正在用Java做一个项目,我们需要一些关于通过套接字发送对象的帮助 到目前为止,我们已经实现了使用ObjectOutputStream和ObjectInputStream通过套接字发送简单对象(int、字符串等等)。然而,我们今天遇到了一个巨大的问题(无论如何,对我们来说是巨大的^^) 我们有一个树形结构,需要从一台电脑发送到另一台电脑。问题是,在该树的每个节点中,我们都有一个对BuffereImage的引用,它是不可序列化的 我们今天已经做了很多研究,发现我们可以使用ImageIO

我和一群朋友正在用Java做一个项目,我们需要一些关于通过套接字发送对象的帮助

到目前为止,我们已经实现了使用
ObjectOutputStream
ObjectInputStream
通过套接字发送简单对象(int、字符串等等)。然而,我们今天遇到了一个巨大的问题(无论如何,对我们来说是巨大的^^)

我们有一个树形结构,需要从一台电脑发送到另一台电脑。问题是,在该树的每个节点中,我们都有一个对BuffereImage的引用,它是不可序列化的

我们今天已经做了很多研究,发现我们可以使用
ImageIO.write()
通过套接字的输出流发送一个BuffereImage,但是,这对我们没有好处,因为我们不需要单独发送BuffereImage,但是它所在的整个树

我们需要的是一种序列化每个BuffereImage的方法(如果存在的话),必要时将其转换为另一个类,同时生成树,并让树的每个节点引用新的可序列化类,这样树就可以作为一个整体对象发送

我们真的不关心性能,因为我们发送的树没有那么大(顶部10-15个节点)。提前谢谢你的帮助,很抱歉英语很糟糕。哦,这是给。。。嗯,一种家庭作业,如果你想记住的话:-)


谢谢

在每个节点上,可以使用writeObject()和readObject()查看更多信息

从本质上讲,它将成为

public Node implements Serializable{

    transient BufferedImage buff;//transient make it so it won't be written with defaultWriteObject (which would error)

    private void writeObject(ObjectOutputStream out)throws IOException{
        out.defaultWriteObject();
        //write buff with imageIO to out
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
        in.defaultReadObject();
        //read buff with imageIO from in
    }
}

在每个节点上,都可以使用writeObject()和readObject()查看更多信息

从本质上讲,它将成为

public Node implements Serializable{

    transient BufferedImage buff;//transient make it so it won't be written with defaultWriteObject (which would error)

    private void writeObject(ObjectOutputStream out)throws IOException{
        out.defaultWriteObject();
        //write buff with imageIO to out
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
        in.defaultReadObject();
        //read buff with imageIO from in
    }
}

如果要使用对象流,可以将缓冲图像包装在实现可序列化且具有字节数组属性(图像数据为字节数组)的类中。您必须修改代码,将BuffereImage引用更改为SerializableImage(类名示例)


如果您这样做,您的类将被序列化并传输。

如果您想使用对象流,您可以将缓冲图像包装在实现可序列化且具有字节数组属性(图像数据为字节数组)的类中。您必须修改代码,将BuffereImage引用更改为SerializableImage(类名示例)


如果这样做,您的类将被序列化并传输。

您可以在客户端将BuffereImage转换为字节数组,然后作为普通字节数组发送,在服务器端从该字节数组创建BuffereImage。下面是将BuffereImage转换为字节数组的代码,反之亦然

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;

public class ImageTest {

public static void main(String[] args) {

    try {

        byte[] imageInByte;
        BufferedImage originalImage = ImageIO.read(new File(
                "c:/darksouls.jpg"));

        // convert BufferedImage to byte array
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(originalImage, "jpg", baos);
        baos.flush();
        imageInByte = baos.toByteArray();
        baos.close();

        // convert byte array back to BufferedImage
        InputStream in = new ByteArrayInputStream(imageInByte);
        BufferedImage bImageFromConvert = ImageIO.read(in);

        ImageIO.write(bImageFromConvert, "jpg", new File(
                "c:/new-darksouls.jpg"));

    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}
}

您可以在客户端将BuffereImage转换为字节数组,然后作为普通字节数组发送,在服务器端从该字节数组创建BuffereImage。下面是将BuffereImage转换为字节数组的代码,反之亦然

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;

public class ImageTest {

public static void main(String[] args) {

    try {

        byte[] imageInByte;
        BufferedImage originalImage = ImageIO.read(new File(
                "c:/darksouls.jpg"));

        // convert BufferedImage to byte array
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(originalImage, "jpg", baos);
        baos.flush();
        imageInByte = baos.toByteArray();
        baos.close();

        // convert byte array back to BufferedImage
        InputStream in = new ByteArrayInputStream(imageInByte);
        BufferedImage bImageFromConvert = ImageIO.read(in);

        ImageIO.write(bImageFromConvert, "jpg", new File(
                "c:/new-darksouls.jpg"));

    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}
}

好的,让我看看我是否得到了这个。基于您给我的链接的读取,每次序列化协议“接触”节点时,都会调用这些方法,从套接字读取(它将调用readObject)或写入套接字(它将调用writeObject)。因此,我必须使用此方法将BuffereImage写入ObjectOutputStream“out”,然后通过调用其defaultWriteObject()方法的套接字发送它???请让我知道我是否做对了^^^写入输出将通过套接字发送,最好先调用默认的读/写,然后读取或写入BuffereImage,您可以在底部查看真实示例用法,效果很好!!非常感谢你!!好的,让我看看我是否得到了这个。基于您给我的链接的读取,每次序列化协议“接触”节点时,都会调用这些方法,从套接字读取(它将调用readObject)或写入套接字(它将调用writeObject)。因此,我必须使用此方法将BuffereImage写入ObjectOutputStream“out”,然后通过调用其defaultWriteObject()方法的套接字发送它???请让我知道我是否做对了^^^写入输出将通过套接字发送,最好先调用默认的读/写,然后读取或写入BuffereImage,您可以在底部查看真实示例用法,效果很好!!非常感谢你!!