繁体   English   中英

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

[英]Getting “java.io.EOFException” when reading data from the socket over a loop

我正在为实践练习制作国际象棋游戏,并完成了所有功能。

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

我初始化流的方式有什么问题吗? 被这个问题困扰了很长时间...并迫切希望看到我的应用程序正常工作。

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

EOFException只是说您到达了流或文件的末尾(文件末尾)。

我不能仅使用您发布的代码进行调试。 但是在调用Stream之前,请确保将移动写入保留或检查“未共享”移动的任何位置。

在套接字上调用readObject()readInt()等时,在没有更多缓冲数据可读取并且已被另一端关闭的套接字上抛出EOFException ,就像readLine()返回null或read()返回- `。 这是“正常的例外”。 只需关闭插座,而不必担心连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM