2014-09-19 53 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); 
    } 
} 

这就是登录数据包。这个和服务器唯一的区别是导入和包声明(它的archipeloserver而不仅仅是archipelo)。正如你所看到的,这个类扩展包,这是我的包类:

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.抱歉把所有的代码都扔掉了。如果我不必这样做,我通常不会这样做。我尽可能减少。如果你需要更多的东西来看看其他东西是如何工作的并且看看问题是否存在,那就问我吧。谢谢!

+0

我也遇到这个问题,你有什么解决方法吗?请分享。 – maohieng 2016-01-23 14:41:25

+0

对不起,这是一年多前。所以我完全不记得解决方案,但我认为它必须处理需要全部设置为公共的包变量。还有数据包需要有一个没有参数的默认构造函数。 Kryonet需要它来序列化对象。 – vedi0boy 2016-01-27 14:49:29

回答

0

Kryo需要一个没有任何参数的构造函数来反序列化。它看起来像你的ClientLoginPacket可能需要一个?这也给我造成了一个问题。直到我在服务器上使用调试kryonet jar并且开启了日志记录之后,我才得到解释它的错误信息。

+0

我意识到这是一个古老的问题,但我想我会为任何其他遇到问题的人发布答案。 – cascade256 2015-01-29 04:31:54

+0

没问题,总有一天肯定会帮助别人。 :) – vedi0boy 2015-01-31 16:48:41

+0

我认为我有一个问题...我试图发送一个字节[] []到服务器它一直工作,直到我发送之前的字节一个其他数据包,现在客户端断开没有任何错误.. Anny解决方案 – genaray 2016-03-12 19:22:55

相关问题