1

練習用のチェス ゲーム アプリケーションを作成して、すべての機能を完成させました。

今、ネットワーク部分を実装して、2 プレイヤー モードを有効にしようとしています...

私のサーバーコードでは、ループを使用して、両方のプレーヤーから順番にデータを継続的に取得しています。

各プレイヤーの最初のターンでは、サーバーは正常に動作し、データが他のプレイヤーに正しく転送されることを確認しました。int[] data1 = (int[]) in1.readUnshared();しかし、ループの最初の行に戻ると、

java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)

エラーが発生...

while(true){

    int[] data1 = (int[]) in1.readUnshared(); // THIS PART!!

    if(data1.length != 96)
        break;

    out2.writeUnshared(data1);
    out2.flush();

    int[] data2 = (int[]) in2.readUnshared();
    if(data1.length != 96)
        break;

    out1.writeUnshared(data2);
    out1.flush();
}

ここで、「in」および「out」変数は、私が宣言したクラス変数です

static ObjectInputStream in1;
static ObjectInputStream in2;
static ObjectOutputStream out1;
static ObjectOutputStream out2;

そして、次のようにメイン関数でそれらを初期化しました:

in1 = new ObjectInputStream(player1.getInputStream());

ストリームを初期化する方法に問題はありますか...? この問題でかなり長い間立ち往生しています...そして私のアプリケーションが動作するのを必死に見ています。

4

2 に答える 2

0

EOFExceptionnullを返すか -`を返すのと同じように、バッファリングされた読み取りデータがなくなり、もう一方の端で閉じられたソケットで 、 などを呼び出すと、 がスローreadObject()されます。これは「通常の例外」です。ソケットを閉じて、接続を忘れてください。readInt()readLine()read()

于 2012-06-14T05:34:58.140 に答える
0

これはオフバイワンエラーだと思います。バッファをフラッシュする必要があるかもしれませんが、readUnshared() を呼び出す前にバッファが空かどうかを書き込んだりチェックしたりしないことが原因である可能性があります。

EOFException は、ストリームまたはファイルの終わり (End Of File) に到達したことを示しています。

あなたが投稿したコードだけでは、実際にデバッグすることはできません。ただし、ストリームを呼び出す前に、「共有されていない」移動が保持されている場所に移動を書き込んでいることを確認するか、確認してください。

于 2012-06-14T05:19:09.733 に答える