2011-01-21 4 views
-4

번 이상 반복되지 동안 나는 클라이언트 메시지가 아닌 경우 루프 번 이상, 내가 드릴 수 없습니다 것이 확인 :루프가 자바

new Thread() {  
    public void run() { 
    while(true) { 
     for(int I=0; I<numPlayers; I++) { 
     if(!players[I].isConnected()) { 
      players[I].drop(); 
      System.out.println("Client disconnected!"); 
      players[I]=null; 
      readers[I]=null; 
      writers[I]=null; 
      numPlayers--; 
     } 
     try { 
      System.out.println(readers[I].ready()); 
      if(readers[I].ready()) { 
      BufferedReader reader = readers[I]; 
      System.out.println("Reading"); 
      switch(reader.read()) { 
       case PacketID.Connect: 
       System.out.println("Connect"); 
       players[I].name=reader.readLine(); 
       PrintWriter writer=writers[I]; 
       writer.write(PacketID.Connect); 
       writer.write(MaxPlayers); 
       writer.write(numPlayers); 
       for(int I2=0;I2<numPlayers;I2++){ 
        writer.println(players[I2].name); 
        players[I2].sendMessage(
        "Client "+players[I].name+" has connected!"); 
       } 
       writer.flush(); 
       break; 
       case PacketID.Ready: 
       System.out.println("lolol lol"); 
       break; 
      } 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } 
    } 
    } 
}.start(); 

나는 사람들이 내 코드가 지저분하다라고 볼 수 있습니다 비효율적이다. 나중에 모두 정리할 것입니다. 또한 스택 오버플로가 내 코드를 잘못 포맷하는 이유를 모르겠습니다.

+3

루프 내의 조건문 (numplayers) 중 하나를 수정하고 있습니다. 그것은 거의 좋은 생각이 아닙니다. –

+0

플레이어의 연결이 끊어지지 않았다고 말할 수 없습니다. 그래서 그 이유가 의심 스럽습니다. 그리고 저는 일반적으로 while 루프에 대해서 이야기하고 있습니다. 반복되지 않습니다. – Someguynamedpie

+7

나중에 정리할 것이라고 말하지만, 나중에 정리하기보다는 깨끗한 코드를 작성하는 것이 더 나은 이유에 대한 교과서 예제입니다! 적절하게 형식을 지정하고 break 문이없는 while 루프 대신 for 루프를 사용했다면 해결책은 찾기 쉽고 어쩌면 명백 할 지 모르겠다. – berry120

답변

0

서버를 매달아 isConnected를 사용하여 수정했습니다.

0

일부 잘못된 break 문은 while 루프에서 벗어날 수 있습니다.

+0

그것에 대해 생각했지만 아직 찾을 수 없습니다. 다시 보겠습니다. – Someguynamedpie

+0

코드가 비정상 인 경우를 알기가 어려웠습니다 – adrianboimvaser

+0

왜 stackoverflow에서 붙여 넣는 지 알지 못합니다. 문제를 해결하려고합니다. – Someguynamedpie

0

while 루프가 진행되는 동안 코드가 올바르게 표시됩니다. 던져지는 예외가 있습니까? 그것은 단지 이유 일뿐입니다.

+0

콘솔에 오류가 표시되지 않습니다. – Someguynamedpie

+2

IDEA는 루프 밖에서 유일한 예외가 있음을 확인합니다. – Synesso

+0

출처를 찾을 수 있습니다. 그것은 클라이언트가 연결할 때마다 루프를 멈춘다 - 아마도 switch 문에서? – Someguynamedpie

1

reader.read() 당신이 다른 문에서 시도를 넣어 입력 할 수

+0

나는 그것이 독서라는 것을 말해주는 메시지를 결코 얻지 못한다. 그래서 그렇게 될 수 없다. 또한 클라이언트가 잘 처리합니다. – Someguynamedpie

+0

루프가 처음으로 완료되었는지 확인할 수 있습니까? – adrianboimvaser

0

에 대한 차단 될 수 있는가?
아마도 독자에게서 무엇이든을 읽고 싶지 않을 것입니다 : null!

+0

나는 모든 것을 쌌다 시도가있다 – Someguynamedpie

+0

좋아, 이렇게 생각해. 루프가 잘 실행되고 플레이어가 연결되면 루프가 중지됩니다. 리더/라이터/플레이어가 설정되기 전에 isConnected가 설정 될 수 있습니까? 너는 아주 단단한 고리에있다 .... – CtrlDot

0

예제를 실행하지 않았지만 생각 프로세스는 다음과 같습니다. 스레드가 시작되어 완료 될 때까지 실행됩니다. 그래서 스레드없이 코드를 실행할 수 있는지 물어 보았습니다. 문제를 격리하는 데 도움이 될 수 있습니다. 건배

0

인쇄물 (안녕하세요 .. ..)에 따르면 독자 [i] .ready()는 실제로 false를 반환하고 읽는 것을 방해하는 것입니다. 나는 "준비가되어있는"사람을 누가 진실로 세울 지 확신하지 못한다. 이 선수 배열에는 "구멍"을지지 않습니다 때문에 예외 루프 단순한 낙하 오프 .. :)

for(int I=0;I<numPlayers;I++) 

루핑의

2

당신의 논리는 흠이 없다. 3 명의 플레이어가 연결되어 있고 (0,1,2) 플레이어 # 0의 연결이 끊어 졌다면 어떻게 될까요? 당신은 "numPlayers"를 감소시키고 플레이어 # 2를 결코 다시 보지 않을 것입니다.

또한 readerswriters 배열에서 null을 확인하는 것으로 보이지 않으므로 readers[I]=null을 입력하면 참조를 시도하기 시작합니다.

... 
    readers[I]=null; 
    writers[I]=null; 
    numPlayers--; 
    } 
    try { 
    System.out.println(readers[I].ready()); 
    ... 

확율은 당신이 스레드에서 모든 일을 실행하고 있기 때문에 그것을 보는 모든이 어딘가에 널 포인터 예외를 던지고, 그리고하지 않을 수 있습니다.