将数据包发送到服务器后,Kryonet客户端断开连接(java)

时间:2014-09-19 13:16:47

标签: java packet disconnect kryonet

我正在做一个小型MMO项目,现在我正在使用登录/注册系统。每当我尝试发送ClientLoginPacket时,客户端都会断开与服务器的连接,服务器根本不会收到数据包。没有显示堆栈跟踪,但这是我的代码。对不起,这很重要,但这一切都是必要的:

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);
    }
}

这是登录数据包。与此服务器和服务器之一的唯一区别是导入和包声明(它的archipeloserver而不仅仅是archipelo)。如您所见,此类扩展了Packet,这是我的Packet类:

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)来发送数据包。这只是在我的主kryonet类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。抱歉抛出所有代码。如果我没有必要,我通常不会这样做。我把尽可能少。如果你需要更多的东西来看看其他东西是如何工作的,看看问题是否存在,那就问问我。谢谢!

1 个答案:

答案 0 :(得分:0)

Kryo需要一个没有任何参数的构造函数来反序列化。看起来你的ClientLoginPacket可能需要一个?这也给我带来了一个问题。直到我在服务器上使用调试kryonet jar并开启登录时才收到解释它的错误消息。