通过循环从套接字读取数据时获取“java.io.EOFException”

时间:2012-06-14 04:10:25

标签: java android networking

我正在为练习制作国际象棋游戏应用程序并完成所有功能。

现在我正在尝试实现网络部分,以启用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());

我初始化流的方式有问题吗? 长期以来一直坚持这个问题......并且迫切希望看到我的应用程序正常运行。

2 个答案:

答案 0 :(得分:0)

我认为这是一个错误的错误,它可能与您刷新缓冲区有关,但在调用readUnshared()之前不会写入或检查它是否为空。

EOFException刚刚说到达了流或文件的末尾(文件结束)。

我无法使用您发布的代码进行真正的调试。但是,在调用Stream之前,请确保将动作写入“非共享”动作的任何位置,或进行检查。

答案 1 :(得分:0)

当您在没有更多缓冲数据要读取且已被另一端关闭的套接字上调用EOFExceptionreadObject()等时,会抛出{p> readInt(),就像readLine()返回null或read()返回-`。这是一个“正常例外”。只需关闭套接字即可忘记连接。