我正在做一个小型 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);
}
我确定的是,在发送数据包之前我确实与服务器建立了连接,我使用服务器上的连接侦听器对其进行了测试。我的问题是什么?我的班级注册有问题吗?两个类是否必须完全相同?提前致谢!
ps 很抱歉把所有的代码都扔掉了。如果没有必要,我通常不会这样做。我尽量少放。如果您需要更多了解其他东西的工作原理并查看问题是否存在,请问我。谢谢!