2014-07-13 2 views
2

난 리스너를 확장 내 클래스 코드의이 작은 조각이 모든 패킷이 구현하는 handle() 메소드. 그런 다음 향후 처리를 위해 ConcurrentLinkedQueue에 추가합니다. 내가 서버에 UDP 패킷을 보낼 몇 개의 키를 스팸 후Kryonet 예외

하지만, 다음과 같은 예외가 발생합니다 :

예외 스레드 "서버"java.lang.ClassCastException가의 : com.esotericsoftware.kryonet .FrameworkMessage $ KeepAlive는 을 com.xkynar.game.net.packet.Packet으로 캐스팅 할 수 없습니다. com.xkynar.game.net.ServerSocket.received (ServerSocket.java:70) com.esotericsoftware.kryonet.Server $ 1 .received (Server.java:61) at com.esotericsoftware.kryonet.Connection.notifyReceived (Connection.java:246) at com.esotericsoftware .kryonet.Server.update java.lang.Thread.run에서 com.esotericsoftware.kryonet.Server.run (Server.java:356)에서 (Server.java:208) (알 소스)

예외는 캐스트에서 발생합니다. 즉,

Packet packet = (Packet) object; 

어떻게 가능합니까? 도대체 "FrameworkMessage $ KeepAlive"는 무엇부터 시작합니까? 왜 내 수신 청취자에게 들어갔습니까?

무엇이 잘못 되었습니까? 내 실수입니까, 버그입니까?

답변

0

FrameworkMessage가있는 인터페이스를 객체를 프레임 워크에 내부적으로 사용되는 것으로 표시하는 데 사용됩니다. the documentation 가입일 :

public interface FrameworkMessage

마커 인터페이스 메시지 닌자 프레임 워크에 의해 사용 및 현상에 일반적으로 보이지 않는 것을 나타내는 것이다. 예를 들어, 이러한 메시지는 Log.LEVEL_TRACE 수준에서만 기록됩니다.

코드가 서버의 유일한 수신기가 아니라고 가정하는 것이 안전합니다. 해결 방법은 런타임에 object의 ID를 확인하는 것입니다. 이것은 kryonet readme에 예시되어있다 : 당신의 코드에서

server.addListener(new Listener() { 
    public void received (Connection connection, Object object) { 
     if (object instanceof SomeRequest) { 
      SomeRequest request = (SomeRequest)object; 

, 당신은 위의 코드에서 PacketSomeRequest을 대체 할 것입니다.

1

문제는 Kryonet 자주 (이 경우 연결 유지 패킷) 연결을 닫지 내 지식없이 패킷을 전송하기 때문에 솔루션의 인스턴스 확인하는 것입니다이었다

@Override 
public void received(Connection connection, Object object) 
{ 
    if(object instanceof Packet) 
     server.addPacket(new ClientPacket(connection.getID(), (Packet) object)); 
} 
0

kryonet에서 서버는 KeepAlive 개체를 계속 전송하므로 클라이언트는 제공된 시간 동안 서버에서 메시지를받지 못하면 시간 초과가 발생하므로 시간 초과로 인해 클라이언트가 연결이 끊어지지 않습니다. 이것을 피하려면 서버가 빈 객체 인 객체를 KeepAlive으로 계속 보내야합니다.

수신 한 오브젝트 이외에도 오브젝트 패킷 이외에도 KeepAlive 오브젝트 패킷이 수신됩니다.

이 문제를 해결하려면 먼저 개체를 캐스팅하려는 클래스의 인스턴스인지 확인해야합니다.

그래서 귀하의 경우에 당신은

if(object instanceof Packet) 
     server.addPacket(new ClientPacket(connection.getID(), (Packet) object)); 
을 할 필요가