2013-05-16 2 views
0

항목에서와 비슷합니다 - 시스템 출력 및 오류 스트림은 Kernel 클래스의 "update"메소드의 catch 절에서 "고정"된 것처럼 보입니다. 이상하게도 내가 프로젝트를 디버깅하고 System.out 라인에서 멈출 때 나는 돌파구를 제거 할 수 있고 모든 것이 올바르게 작동한다.소켓 catch 절의 시스템 출력/오류 스트림은 디버그 모드에서만 작동합니다.

마지막 System.out을 제외한 모든 항목이 실행되며, 기본 System.out을 교체 할 때에도 작동하지 않습니다.

현재 연결이 완료된 직후에 사용자의 연결을 끊습니다.

내 코드, StartServer.java :

public class StartServer { 

    public static void main (String[] args) { 
     Kernel kernel = new Kernel(4444); 
     kernel.run(); 
     while (true) { 
      kernel.update(); 
     } 
    } 

} 

Kernel.java :

import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Kernel { 

    ArrayList<Socket> clients; 
    ServerSocket socket; 

    public Kernel(int port) { 
     try { 
      socket = new ServerSocket(port); 
      clients = new ArrayList<>(); 
      System.out.println("Server initialized"); 
     } catch (IOException ex) { 
      Logger.getLogger(StartServer.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void run() { 
     Thread thread = new Thread(){ 
      public void run() { 
       try { 
        while (true) { 
         Socket client = socket.accept(); 
         clients.add(client); 
         System.out.println("New user on the server!"); 
        } 
       } catch (IOException ex) { 
        Logger.getLogger(Kernel.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }; 
     thread.start(); 
    } 

    public void update() { 
     for (int i=0; i<clients.size(); i++) { 
      Socket s = clients.get(i); 
      try { 
       /*String result; 
       if (s.getInputStream().available()!=0) { 
        byte[] byteRes = new byte[s.getInputStream().available()]; 
        char[] charRes = new char[s.getInputStream().available()]; 
        s.getInputStream().read(byteRes); 
        for (int i2=0; i2<charRes.length; i2++) { 
         charRes[i2] = (char) byteRes[i2]; 
        } 
        result = String.copyValueOf(charRes); 
        System.out.println(result); 
       }*/ 
       throw new IOException(); 
      } catch (IOException ex) { 
       try { 
        System.out.println("Client disconnected"); //working only in debug mode 
        clients.remove(s); 
        s.close(); 
        i--; 
       } catch (IOException ex1) { 
        Logger.getLogger(Kernel.class.getName()).log(Level.SEVERE, null, ex1); 
       } 
      } 
     } 
    } 

} 
+0

* 어떤 * IOException에 '클라이언트 연결이 끊어졌습니다'? 예외 자체에서 메시지를 인쇄해야합니다. 이런 중요한 정보를 놓치지 마십시오. 그리고 '브레이크 포인트'를 의미합니까? – EJP

답변

1

무한 루프를 다음에서 변경하십시오. StartServer 클래스는 다음과 같습니다 :

while (true) { 
    try { 
     Thread.sleep(10); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    kernel.update(); 
} 
+0

매우 큰 감사합니다! :) – Mac70

0

봅니다)합니다 (에서 System.out.println 후

System.out.flush(); 

를 추가

+0

같은 결과 – Mac70

관련 문제