1

我仍在学习 Java,我搜索了 Kryonet 的 Javadoc,但没有找到任何问题的答案。

我正在向一个简单的聊天程序添加网络摄像头功能。

我目前正在尝试将我的网络摄像头拍摄的单帧传输到另一台计算机。

Kryonet 允许我发送“自制”数据包,所以制作了这个数据包:

Packet9WebcamFrame.java

import java.awt.image.BufferedImage;

public class Packet9WebcamFrame{
    public BufferedImage frame;
}

在我的客户中,我必须注册这个数据包:

client.getKryo().register(Packet9WebcamFrame.class);

但后来我遇到了让我注册其他课程的错误:

client.getKryo().register(java.awt.image.BufferedImage.class);
client.getKryo().register(java.awt.image.ComponentColorModel.class);
client.getKryo().register(java.awt.color.ICC_ColorSpace.class);
client.getKryo().register(float[].class);
client.getKryo().register(java.awt.color.ICC_ProfileRGB.class);
client.getKryo().register(short[].class);
client.getKryo().register(byte[].class);
client.getKryo().register(int[].class);
client.getKryo().register(sun.awt.image.SunWritableRaster.class);
client.getKryo().register(java.awt.image.DataBufferByte.class);
client.getKryo().register(byte[][].class);

所以,现在,当我的客户收到说“你好,我需要你给我发送一个网络摄像头帧”的数据包时,它会这样做:

webcam.open();

    if (webcam.isOpen())
    {

        Packet9WebcamFrame wFrame = new Packet9WebcamFrame();

        wFrame.frame = webcam.getImage();

        //We send the frame via the packet
        try
        {
            Main.client.sendTCP(wFrame);
        }

        catch (Exception e)
        {
            e.printStackTrace();
        }
        System.out.println("I have sent a webcam frame");

        webcam.close();

    }       

之后我希望它会工作,但仍然是一个错误:

com.esotericsoftware.kryo.KryoException: java.nio.BufferOverflowException 序列化跟踪:bankdata (java.awt.image.DataBufferByte) dataBuffer (sun.awt.image.SunWritableRaster) 光栅 (java.awt.image.BufferedImage)

框架(com.jmr.monitor.packets.Packet9WebcamFrame)

在 com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:585) 在 com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) 在 com.esotericsoftware.kryo.Kryo.writeObject (Kryo.java:504) 在 com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564) 在 com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) 在 com。 esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504) 在 com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564) 在 com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer. java:213) 在 com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504) 在 com.esotericsoftware.kryo.serializers。FieldSerializer$ObjectField.write(FieldSerializer.java:564) at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:571) at com .esotericsoftware.kryonet.KryoSerialization.write(KryoSerialization.java:50) at com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192) at com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59) at com.jmr.monitor.PacketHandler.handlePacket4(PacketHandler.java:131) 在 com.jmr.monitor.Main$1.received(Main.java:93)KryoSerialization.write(KryoSerialization.java:50) at com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192) at com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59) at com.jmr.monitor .PacketHandler.handlePacket4(PacketHandler.java:131) 在 com.jmr.monitor.Main$1.received(Main.java:93)KryoSerialization.write(KryoSerialization.java:50) at com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192) at com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59) at com.jmr.monitor .PacketHandler.handlePacket4(PacketHandler.java:131) 在 com.jmr.monitor.Main$1.received(Main.java:93)

所以,这是一个 bufferOverflow 问题,我在客户端的构造函数中尝试了一些事情,例如增加缓冲区大小,但到目前为止没有运气。

关于如何解决这个烦人的问题的任何想法?

先感谢您。

问候,

阿兹德。

4

1 回答 1

0

一个包有一个固定的大小(我猜)。我遇到了类似的问题。归结为 BufferedImage 没有非参数构造函数,如果使用不同的方法来解决这个问题,例如在反序列化时根本不使用构造函数,它就会向南。

所以基本上你想要的是序列化缓冲图像。您可以做的一件事是提供自己的序列化程序(可以在他们的 github 页面上读取)或提取 RGB 版本或存储图像的字节/整数内容,甚至将 PNG 写入内存并发送 PNG/JPG 代替(给你压缩)。

于 2015-11-17T17:42:03.393 回答