我还在学习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序列化跟踪:银行数据(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) at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504) at 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.writeObject(Kryo.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。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) at com.jmr.Mnor.Main$1收到(Main.java:93)
因此,这是一个bufferOverflow问题,我在客户端的构造函数中尝试了一些东西,比如增加缓冲区大小,但到目前为止还没有成功。
知道如何解决这个烦人的问题吗?
提前谢谢你。
致以敬意,
阿兹德。
发布于 2015-11-17 17:42:03
一个包裹有固定的尺寸(我猜)。我遇到了一个类似的问题。总之,BufferedImage没有非参数构造函数,如果使用不同的方法来解决这个问题,比如在反序列化时根本不使用构造函数,那么它就会往南走。
所以基本上你想要的是序列化一个缓冲的图像。您可以做的一件事是提供自己的序列化程序(可以在其github页面上读取),或者提取RGB版本,或者存储图像的字节/ int内容,甚至将PNG写到内存中,然后将PNG/JPG发送到内存中(提供压缩)。
https://stackoverflow.com/questions/26207154
复制相似问题