私はまだ Java を学んでおり、Kryonet の Javadoc を検索しましたが、私の問題に対する答えが見つかりませんでした。
単純なチャット プログラムに Web カメラ機能を追加しています。
現在、ウェブカメラで撮影した単一のフレームを別のコンピューターに転送しようとしています。
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) raster (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) で 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)KryoSerialization.write(KryoSerialization.java:50) com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192) com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59) com.jmr.monitor com.jmr.monitor.Main$1.received(Main.java:93) の .PacketHandler.handlePacket4(PacketHandler.java:131)KryoSerialization.write(KryoSerialization.java:50) com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192) com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59) com.jmr.monitor com.jmr.monitor.Main$1.received(Main.java:93) の .PacketHandler.handlePacket4(PacketHandler.java:131)
したがって、これは bufferOverflow の問題です。クライアントのコンストラクターで、バッファー サイズを増やすなど、いくつかのことを試しましたが、今のところうまくいきません。
この厄介な問題を解決する方法について何か考えはありますか?
前もって感謝します。
よろしく、
アズデ。