我仍在学习 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 问题,我在客户端的构造函数中尝试了一些事情,例如增加缓冲区大小,但到目前为止没有运气。
关于如何解决这个烦人的问题的任何想法?
先感谢您。
问候,
阿兹德。