Я делаю небольшой проект 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);
}
}
Это пакет для входа. Единственная разница с этим и сервером - это объявление импорта и пакета (его архипеласер, а не просто архипела). Как вы можете видеть, этот класс расширяет 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. извините за выброс всего этого кода. Обычно я этого не делал, если бы мне этого не нужно. Я поставил как можно меньше. Если вам нужно больше посмотреть, как работает другой материал, и посмотреть, есть ли проблема, просто спросите меня. Благодаря!
У меня также есть эта проблема, есть ли у вас решение? Поделись, пожалуйста. – maohieng
Прошу прощения, это было более года назад. поэтому я не помню решение точно, но я думаю, что он имеет отношение к переменным пакета, которым все должны быть доступны для публики. Кроме того, пакеты должны иметь конструктор по умолчанию без параметров. Kryonet нуждается в том, чтобы сериализовать объекты. – vedi0boy