Java 克鲁尼特,可以';不发送缓冲区映像
我还在学习Java,我已经搜索了Kryonet的Javadoc,但没有找到任何问题的答案 我在一个简单的聊天程序中添加了一个网络摄像头功能 我目前正在尝试将我的网络摄像头拍摄的单个帧传输到另一台计算机 Kryonet允许我发送“自制”数据包,因此制作了此数据包:Java 克鲁尼特,可以';不发送缓冲区映像,java,buffer,overflow,kryonet,Java,Buffer,Overflow,Kryonet,我还在学习Java,我已经搜索了Kryonet的Javadoc,但没有找到任何问题的答案 我在一个简单的聊天程序中添加了一个网络摄像头功能 我目前正在尝试将我的网络摄像头拍摄的单个帧传输到另一台计算机 Kryonet允许我发送“自制”数据包,因此制作了此数据包: client.getKryo().register(Packet9WebcamFrame.class); Packet9WebcamFrame.java import java.awt.image.BufferedImage; pu
client.getKryo().register(Packet9WebcamFrame.class);
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.buffereImage)
帧(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)
在
com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
在com.esotericsoftware.kryo.kryo.writeClassAndObject(kryo.java:571)上
在
com.esotericsoftware.kryonet.KryoSerialization.write(KryoSerialization.java:50)
在
com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192)
在
com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59)
在
com.jmr.monitor.PacketHandler.handlePacket4(PacketHandler.java:131)
com.jmr.monitor.Main$1.received(Main.java:93)
因此,这是一个缓冲区溢出问题,我在客户端的构造函数中尝试了一些方法,例如增加缓冲区大小,但到目前为止没有成功
你知道如何解决这个恼人的问题吗
先谢谢你
问候,
Azsde.我想一个包裹有固定的大小。我遇到了类似的问题。归根结底,BuffereImage没有无参数构造函数,如果使用不同的方法来解决这个问题,就像在反序列化时根本不使用构造函数一样,那么它就会失败 所以基本上你想要的是序列化一个缓冲图像。您可以做的一件事是提供自己的序列化程序(可以在他们的github页面上读取),或者提取RGB版本,或者存储图像的byte/int内容,甚至将PNG写入内存并发送PNG/JPG(提供压缩)