2012-06-14 3 views
1

연습을위한 체스 게임 응용 프로그램을 만들고 모든 기능을 마쳤습니다. 2 플레이어 모드를 활성화 할 수 있도록 루프를 통해 소켓에서 데이터를 읽을 때 "java.io.EOFException"받기

지금 내 서버 코드에서

내가 계속 회전에 의해 두 선수 차례에서 데이터를 얻을 수있는 루프를 사용하고 ... 네트워킹 부분을 구현하기 위해 노력하고 있습니다.

각 플레이어의 첫 번째 턴에서 서버가 정상적으로 작동하고 데이터가 다른 플레이어에게 올바르게 전송되었음을 확인했습니다. 그것은 다시 루프의 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(); 
} 

"에서"와 "밖으로"변수는 클래스 변수 I는

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

를 선언하고이 같은 주요 기능에 그들을 initilized :

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

스트림을 초기화하는 방법에 문제가 있습니까? 꽤 오래 동안이 문제에 붙어 있었고 ... 내 응용 프로그램이 작동하는지 필사적으로 보았습니다.

+0

왜 변수가 정적입니까? – EJP

답변

0

이 오류는 하나의 오류로 인해 발생한다고 생각합니다. 버퍼를 비우는 것과 관련이있을 수 있지만 readUnshared()를 호출하기 전에 비어 있는지 확인하거나 쓰지 않아야합니다.

EOFException은 스트림 또는 파일 (파일 끝)의 끝에 도달했다고 말한 것입니다.

게시 한 코드만으로는 실제로 디버깅 할 수 없습니다. 그러나 스트림을 호출하기 전에 "공유되지 않은"동작을 유지하거나 확인하는 모든 곳으로 움직임을 기록하고 있는지 확인하십시오. 당신은 더 이상 읽을 데이터를 버퍼링하고 다른 쪽 끝을에 의해 폐쇄 된 소켓 등 readObject(), readInt()를 호출 할 때

0

EOFException은 -` 반환 null을 반환 또는 read() 단지 readLine()처럼 발생합니다. '정상적인 예외'입니다. 소켓을 닫고 연결을 잊어 버리십시오.

관련 문제