2012-06-14 103 views
1

我正在为练习制作一款国际象棋游戏应用程序,并完成了所有功能。通过循环从套接字读取数据时获取“java.io.EOFException”

现在我想实现联网的一部分,从而使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”和“出”的变量是类变量我声明

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

我initilized他们这样的主要功能:

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

有没有什么问题,我初始化流的方式......? 一直被这个问题困住了很长时间......并且绝望地看到我的应用程序工作。

+0

为什么这些变量是静态的? – EJP

回答

0

我认为这是一个错误,它可能与你冲洗缓冲区,但不写或检查在调用readUnshared()之前是否为空。

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

我不能真正调试它只是你发布的代码。但请确保在调用Stream之前,您正在写入移动到“未共享”移动的任何位置,或者进行检查。当你调用readObject()readInt(),等等,已经没有更多的缓冲数据读取和已经被另一端关闭套接字

0

EOFException被抛出,就像readLine()返回null或read()返回-`。这是一个'正常例外'。只需关闭插座并忘记连接。