2014-09-19 4 views
0

저는 약간의 MMO 프로젝트를하고 있습니다 만, 지금은 로그인/등록 시스템에서 일하고 있습니다. ClientLoginPacket을 보내려고 할 때마다 클라이언트는 서버와의 연결을 끊고 서버가 패킷을 전혀받지 못합니다. 나타나는 스택 추적은 없지만 여기에 내 코드가 있습니다. 죄송가 많이 있어요하지만 필요한 모든입니다 :Kryonet 클라이언트가 서버에 패킷을 보낸 후 연결을 끊습니다. (java)

ClientLoginPacket.java :

로그인 패킷의
package net.vediogames.archipelo.networking.packets; 

import net.vediogames.archipelo.networking.Networking; 

public class ClientLoginPacket extends Packet{ 

    private String username; 
    private String password; 
    private int validity = 0; 

    public ClientLoginPacket(String username, String password){ 
     this.username = username; 
     this.password = password; 
    } 

    public String getUsername(){ 
     return this.username; 
    } 

    public String getPassword(){ 
     return this.password; 
    } 

    public int getLoginValidity(){ 
     return validity; 
    } 

    public void setLoginValidity(int validity){ 
     this.validity = validity; 
    } 

    public void send(){ 
     Networking.sendTCP(this); 
    } 
} 

. 이 패키지와 서버의 유일한 차이점은 가져 오기 및 패키지 선언 (그냥 archipelo가 아닌 archipeloserver)입니다.

package net.vediogames.archipelo.networking.packets; 

public abstract class Packet { 

    protected int connectionID; 

    public abstract void send(); 

    public int getConnectionId(){ 
     return connectionID; 
    } 
    public void setConnectionID(int id){ 
     this.connectionID = id; 
    } 

} 

모든 패킷을 보내도록 호출되는 send() 방법이있다 : 당신이 볼 수 있듯이,이 클래스는 패킷을 확장, 여기 내 패킷 클래스입니다. 패킷을 보내는 방법은 다음과 같습니다. new ClientLoginPacket(username, password).send();. ClientLoginPacket 클래스는 패킷을 보낼 Networking.sentTCP (this)를 실행하는 것을 볼 수 있습니다. 이것은 단지 내 메인 크 라이넷 클래스 Networking.java에서이 코드를 실행합니다. 다음은 클라이언트 측에서 패킷을 보내는 데 사용하는 코드입니다.

public static void sendTCP(Packet object){ 
    client.sendTCP(object); 
} 

kryonet에서 보내기 전에 클래스를 등록해야합니다. 나는 그것을했다. 그러나 내가 올바르게했는지 나는 모른다. 다음은 내가 사용한 정확한 코드입니다. 서버 :

private static void setupClasses(){ 
    Kryo kryo = server.getKryo(); 
    kryo.register(ClientRegisterPacket.class); 
    kryo.register(ClientLoginPacket.class); 
    System.out.println("Registered classes."); 
} 

클라이언트 :

public static void setupClasses(){ 
    Kryo kryo = client.getKryo(); 
    kryo.register(ClientRegisterPacket.class); 
    kryo.register(ClientLoginPacket.class); 
} 

내가 확실히 아는 것은 내가 패킷을 전송하기 전에 서버에 연결해야 할 것입니다, 나는 서버에 연결 리스너를 테스트했다. 내 문제는 무엇입니까? 수업 등록에 문제가 있습니까? 두 클래스가 완전히 동일해야합니까? 미리 감사드립니다!

p.s. 모든 코드를 던지서 죄송합니다. 내가하지 않으면 나는 보통 이것을하지 않을 것이다. 나는 가능한 한 최소한의 것을 넣었다. 다른 물건이 어떻게 작동하는지보고 문제가 있는지 보려면 더 자세히 알아 보려면 그냥 묻습니다. 감사!

+0

이 문제도 발생합니다. 해결책이 있습니까? 공유하십시오. – maohieng

+0

죄송합니다. 1 년 전이었습니다. 그래서 나는이 솔루션을 정확하게 기억하지 못한다.하지만 나는 그것이 대중에게 공개 될 필요가있는 패킷 변수와 관련이 있다고 생각한다. 또한 패킷에는 매개 변수가없는 기본 생성자가 있어야합니다. Kryonet은 객체를 직렬화 할 필요가있다. – vedi0boy

답변

0

Kryo에는 deserialize 할 인수가없는 생성자가 필요합니다. ClientLoginPacket이 필요할 수도 있습니다. 이것은 나에게도 문제를 일으켰다. 서버에서 디버그 kryonet 항아리를 사용하고 설명하는 오류 메시지가 표시되면서 로깅을 켜기 전까지는 그렇지 않았습니다.

+0

나는 이것이 낡은 질문이라는 것을 알았지 만, 나는 이것에 문제가있는 다른 사람들에게 대답을 게시 할 것이라고 생각했다. – cascade256

+0

문제 없습니다, 언젠가 누군가를 확실히 도울 것입니다. :) – vedi0boy

+0

나는 문제가 있다고 생각해. 나는 Byte [] []를 서버에 보내려고 노력하고있다. 항상 Byte 앞에 다른 패킷을 보내고, 클라이언트는 오류없이 연결을 끊는다. Anny 솔루션 ?? – genaray