2013-02-27 2 views
1

저는 Slick2d와 함께 Kryonet을 사용하여 Java 게임을 만들고 있습니다.Slick2D KryoNet 애플릿

그러나, 자바 응용 프로그램으로 실행할 때 다음과 같은 오류를 얻을 애플릿으로 실행하는 경우 그것은 잘 작동

:

00:00 INFO: [kryonet] Server opened. 
00:04 DEBUG: [kryonet] Port 9991/TCP connected to: /(ip):55801 
00:04 DEBUG: [kryo] Write: RegisterTCP 
00:04 INFO: [kryonet] Connection 1 connected: /(ip) 
00:04 INFO: [SERVER] Someone has connected. 
00:04 ERROR: [kryonet] Error reading TCP from connection: Connection 1 
com.esotericsoftware.kryonet.KryoNetException: Error during deserialization. 
    at com.esotericsoftware.kryonet.TcpConnection.readObject(TcpConnection.java:141) 

    at com.esotericsoftware.kryonet.Server.update(Server.java:192) 
    at com.esotericsoftware.kryonet.Server.run(Server.java:350) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: com.esotericsoftware.kryo.KryoException: Buffer underflow. 
    at com.esotericsoftware.kryo.io.Input.require(Input.java:162) 
    at com.esotericsoftware.kryo.io.Input.readLong(Input.java:621) 
    at com.esotericsoftware.kryo.io.Input.readDouble(Input.java:745) 
    at com.esotericsoftware.kryo.serializers.DefaultSerializers$DoubleSerializer.read(DefaultSerializers.java:141) 
    at com.esotericsoftware.kryo.serializers.DefaultSerializers$DoubleSerializer.read(DefaultSerializers.java:131) 
    at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:735) 
    at com.esotericsoftware.kryonet.KryoSerialization.read(KryoSerialization.java:57) 
    at com.esotericsoftware.kryonet.TcpConnection.readObject(TcpConnection.java:139) 
    ... 3 more 
00:04 INFO: [SERVER] Someone has disconnected. 
00:04 INFO: [kryonet] Connection 1 disconnected. 

서버는 HTML 파일에서 실행 가능한 항아리와 클라이언트 애플릿으로 로컬로 실행됩니다 xampp을 웹 서버로 작동하도록 로컬로 실행하고 있습니다.

다른 serializer, 버퍼 크기 및 단일 문자열/부울 값 보내기 등을 시도했지만 아무 것도 좋아 보이지 않습니다. 클라이언트는 서버에 완벽하게 연결되지만 어떤 패킷을 보낼 때 어떤 패킷을 보내더라도 위의 오류가 발생합니다.

어떤 도움/조언을 부탁드립니다. 잠시 동안이 문제에 난처한 경험이 있습니다. 감사합니다.

답변

0

동일한 문제가 있거나 적어도 비슷한 문제가 있다고 생각합니다. 나는 서버와 클라이언트를 위해 Kryonet을 사용하고있다. 클라이언트는 애플릿이므로 Eclipse 애플릿 뷰어를 실행할 때 제대로 작동합니다. 웹 서핑을 실행하면 유사한 오류가 발생합니다. 클라이언트와 서버가 연결되면 서버는 클라이언트의 패킷을 받지만 클라이언트는 모든 비 직렬화를 시도 할 때마다 오류를 제공합니다. 나는 애플릿 권한이 탓이라고 발견했다. 애플릿 뷰어 (Eclipse를 사용하는 경우)의 권한을 웹 페이지와 동일하게 변경하면 동일한 오류가 발생합니다. 장점은 문제를 디버그 할 수 있다는 것입니다.

Eclipse의 권한을 변경하려면 프로젝트 폴더 \ bin \으로 이동하여 "java.policy.applet"을 엽니 다. 당신이해야 내부의

grant { 
    permission java.security.AllPermission; 
}; 

변경에 있음이 변화

grant { 
    permission java.io.FilePermission "<<ALL FILES>>", "read, write, execute, delete"; 
    permission java.net.SocketPermission "*", "accept, connect, listen, resolve"; 
    permission java.util.PropertyPermission "*", "read, write"; 
    permission java.lang.RuntimePermission "*"; 
    permission java.awt.AWTPermission "showWindowWithoutWarningBanner"; 
}; 

나는 임베디드 애플릿에서와 같이 애플릿 뷰어에 대해 동일한 동작을했다. 이것은 완전한 해결책은 아니지만 문제의 원인을 찾는 데 도움이 될 수 있습니다.

업데이트 : 내 경우에 어떤 문제가 있는지 찾아 냈습니다. 문제는 FieldSerializer와 그것을 사용하는 다른 시리얼 라이저에있다. 클래스가 등록되면, FieldSerializer는 그것의 필드를 넘겨주고 그것들 모두는 접근 가능하도록 설정한다. 이 작업은 애플릿에는 허용되지 않습니다. 결과적으로 잘못된 등록 및 직렬화/역 직렬화가 발생합니다. 나는 2 가지 대안을 발견했다 :

1) 다른 시리얼 라이저 사용. 디폴트는 FieldSerializer이며

public void setDefaultSerializer (Class<? extends Serializer> serializer) 

다른 옵션은 각 클래스를 등록 할 때 serializer를 설정하는 것입니다. FieldSerializer를 기반으로 한 serializer를 사용하지 마십시오.

2) FieldSerializer를 수정하십시오. 내가하는 일은 완전히 정확하지는 않지만 내 경우에는 효과가있다. 접근성 설정으로 인해 Exception이 발생한다면 FieldSerializer는 등록을 계속할 것이다. 우리가해야 할 또 다른 일은 등록한 클래스의 모든 필드를 public으로 설정하는 것입니다. FieldSerializer를 변경하려면 Kryo 소스가 필요합니다. FieldSerializer.java로 이동하여 rebuildCachedFields()를 호출하십시오.당신은 거기에 다음 코드를 찾을 수 있습니다 : 등록 된 모든 클래스는 public 필드를 가지고있다 변경해야

if (!field.isAccessible()) { 
     if (setFieldsAsAccessible) 
     try { 
      field.setAccessible(true); 
     } catch (AccessControlException ex) { 
     } 
    } 

다른 것은 :

if (!field.isAccessible()) { 
     if (!setFieldsAsAccessible) continue; 
     try { 
      field.setAccessible(true); 
     } catch (AccessControlException ex) { 
      continue; 
     } 
    } 

당신은 해당 변경해야합니다.

0

나는 gradle 빌드에서 비슷한 문제가 있습니다. 애플릿에 대한 메모리 (힙 또는 PermSize)를 늘려야 할 수도 있습니다.