0

私は小さな 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);
    }
}

それがログインパケットです。これとサーバーの唯一の違いは、インポートとパッケージの宣言です (単なる archipelo ではなく archipeloserver)。ご覧のとおり、このクラスは 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();です。Networking.sentTCP(this) を実行してパケットを送信することがわかる ClientLoginPacket クラスです。これは、メインの 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そのコードをすべて捨てて申し訳ありません。必要がなければ、通常はこれを行いません。なるべく入れません。他のものがどのように機能するかを確認し、問題があるかどうかを確認するためにさらに必要な場合は、私に尋ねてください. ありがとう!

4

1 に答える 1

2

Kryo には、デシリアライズする引数のないコンストラクターが必要です。ClientLoginPacket が必要なように見えますか? これは私にとっても問題を引き起こしました。サーバーでデバッグ kryonet jar を使用し、ログをオンにして初めて、それを説明するエラー メッセージが表示されました。

于 2015-01-29T04:26:47.233 に答える