2014-10-05 1 views
1

저는 여전히 Java를 배우고 있으며 Kryonet의 Javadoc을 검색하여 내 문제에 대한 답을 찾지 못했습니다.Kryonet, BufferedImage를 보낼 수 없습니다

간단한 채팅 프로그램에 웹캠 기능을 추가하고 있습니다.

현재 웹캠으로 촬영 한 단일 프레임을 다른 컴퓨터로 전송하려고합니다.

Packet9WebcamFrame.java 그때이 패킷 등록했다 내 클라이언트에서

import java.awt.image.BufferedImage; 

public class Packet9WebcamFrame{ 
    public BufferedImage frame; 
} 

:

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

Kryonet는 "수제"패킷, 그래서이 패킷을 만들어 나에게 보낼 수 있습니다

하지만 다른 클래스를 등록하게하는 오류가있었습니다.

01 23,516,
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) RAST ER (java.awt.image.BufferedImage)

프레임 (com.jmr.monitor.packets.Packet9WebcamFrame) com.esotericsoftware.kryo.serializers.FieldSerializer $ ObjectField.write에서

(FieldSerializer.java : com.esotericsoftware.kryo에서 com.esotericsoftware.kryo.Kryo.writeObject에서 com.esotericsoftware.kryo.serializers.FieldSerializer.write (FieldSerializer.java:213) (Kryo.java:504)에서 585) . serializers.FieldSerializer $ ObjectField.write (FieldSerializer.java:564) at com.esotericsoftware.kryo.serializers.FieldSerializer.wri te (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) com.esotericsoftware.kryo.Kryo.writeObject (Kryo.java:504) at com.esotericsoftware.kryo.serializers.FieldSerializer $ ObjectField 에 .write com.esotericsoftware.kryo.serializers.FieldSerializer.write (FieldSerializer.java:213)에서 (FieldSerializer.java:564) com.esotericsoftware.kryo.Kryo.writeClassAndObject (Kryo.java:571)에서 에서 com.esotericsoftware.kryonet.KryoSerial ization.write com.esotericsoftware.kryonet.Connection.sendTCP (연결에서 com.esotericsoftware.kryonet.TcpConnection.send (TcpConnection.java:192)에서 (KryoSerialization.java:50) .자바 :

그래서 com.jmr.monitor.PacketHandler.handlePacket4 (PacketHandler.java:131) com.jmr.monitor.Main $ 1.received에서 (Main.java:93) 59) , 그것은 bufferOverflow 문제입니다, 나는 내 클라이언트의 생성자에서 버퍼 크기를 늘리는 것과 같은 몇 가지 시도했지만 지금까지는 행운이 없습니다.

이 성가신 문제를 해결하는 방법에 대한 아이디어가 있으십니까?

미리 감사드립니다.

감사합니다,

Azsde.

답변

0

패키지의 크기는 고정되어 있습니다 (추측됩니다). 나는 비슷한 문제를 고집했다. BufferedImage에는 인수가없는 생성자가 없으며 비 직렬화 할 때 생성자를 전혀 사용하지 않는 것과 같은 다른 방법을 사용하여이 문제를 해결하면 남향으로 간다.

기본적으로 원하는 것은 버퍼링 된 이미지를 직렬화하는 것입니다. 당신이 할 수있는 한가지는 자신의 serializer (github 페이지에서 읽을 수 있음)를 제공하거나 RGB 버전을 추출하거나 이미지의 바이트/int 내용을 저장하거나 PNG를 메모리에 쓰고 대신 PNG/JPG를 보내는 것입니다 (당신에게 압축을 제공합니다).