1

私は現在、将来のプロジェクトのための単純なサーバー - クライアント構造に取り組んでいます。ローカル/パブリックIP、タイムスタンプなどのカスタムヘッダー情報を使用して独自のデータパッケージを作成するのが最善であると判断しました。以下は、私が思いついたクラスです:

public class DataPackage {
    private Object object;
    private Date time;
    private long timeMs;
    private boolean responded;
    private String publicIp;
    private String internalIp;
    private int hash;

    public DataPackage(Object object) {
        this.object = object;
        this.responded = false;
        this.time = Calendar.getInstance().getTime();
        this.timeMs = System.currentTimeMillis();
        this.publicIp = this.generatePublicIp();
        this.internalIp = this.generateInternalIp();
        this.hash = System.identityHashCode(this);
    }

    private String generatePublicIp() {
        try {
            URL whatismyip = new URL("http://checkip.amazonaws.com");
            BufferedReader in = new BufferedReader(new InputStreamReader(whatismyip.openStream()));

            return in.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    private String generateInternalIp() {
        try {
            return InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

(ゲッターとセッターを削除しました)

クラスで何でも送信できるように、オブジェクトを使用することにしました。コンパイルはうまくいきますが、クラスにパッケージ化された単純な文字列を送信しようとすると、NotSerializableException が発生します。ストリームに変換できない属性またはフィールドはありますか、またはクラスをジェネリックに変更する必要がありますか? 私はストリームとネットワーキングの専門家ではないので、私が得ることができるあらゆる助けと説明に感謝しています.

注: 私は英語のネイティブ スピーカーではありませんが、つづりや文法の問題はご容赦ください。

4

3 に答える 3

1

クラスをネットワーク経由で転送するには、Serializable インターフェイスを実装する必要があります。

クラスの最初の行を次のように変更します。

import java.io.Serializable;
public class DataPackage implements Serializable{
于 2018-04-24T15:59:09.267 に答える