Я делаю небольшой ММО-проект и сейчас работаю над системой входа/регистрации. Всякий раз, когда я пытаюсь отправить 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);
}
}
Это пакет входа. Единственная разница между этим и серверным - это объявление импорта и пакета (его архипелосервер, а не просто архипело). Как видите, этот класс расширяет 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);
}
В Крионете вы должны зарегистрировать занятия перед их отправкой. Я сделал это, но я не знаю, правильно ли я это сделал. Вот точный код, который я использовал. Сервер:
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. извините, что выкинул весь этот код. Обычно я бы не стал этого делать, если бы мне не пришлось. Ставлю как можно меньше. Если вам нужно больше, чтобы увидеть, как работают другие вещи, и увидеть, есть ли проблема, просто спросите меня. Спасибо!