2013-07-15 2 views
1

나는 간단한 것을 이해할 수 없다. 소켓 입력을 처리하는 클래스가 있습니다.SocketException 처리

public class EntryPoint implements Runnable { 

     private Socket socket = null; 
     private BufferedReader br = null; // receives data from the destination 

... 

     public void run() {  
      String command = null;  // buffer for holding one request from command line 
      StringReader commandReader = null; // stream for reading command 
      try { 
       while (!socket.isClosed() && (command = br.readLine()) != null) {    
        try { 
         command = command.trim(); 
         commandReader = new StringReader(command); 
         Request req = JAXB.unmarshal(commandReader, Request.class); 
         commandReader.close(); 
         dispatcher.sendRequest(req);           
        } catch(DataBindingException ex) { 
         response.sendResponse(SystemMessageFactory.INVALID); 
         response.sendResponse(SystemMessageFactory.SOCKET_SHUTDOWN); 
        }      
       } 
      } catch (SocketException e) { 
       System.out.println("Socket Exception"); 
      } catch (IOException e) { 
       Logger.getLogger("server").log(Level.SEVERE, 
         "Error reading the command input of the client!", e); 
      } 
     }  

    } 

피어 갑자기 소켓을 종료, 연결 재설정이 전송 : 나는 포괄 조항이있다. 스택 추적은 다음과 같습니다.

16.07.2013 1:39:51 EntryPoint run 
SEVERE: Error reading the command input of the client! 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:168) 
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) 
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) 
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) 
    at java.io.InputStreamReader.read(InputStreamReader.java:167) 
    at java.io.BufferedReader.fill(BufferedReader.java:136) 
    at java.io.BufferedReader.readLine(BufferedReader.java:299) 
    at java.io.BufferedReader.readLine(BufferedReader.java:362) 
    at blood.steel.server.EntryPoint.run(EntryPoint.java:36) 
    at java.lang.Thread.run(Thread.java:662) 

어떻게 가능합니까? 나는 그것을 두 번 붙잡고있다! SocketException은 자체 catch 절 및 IOException catch 절에서 catch됩니다. 그러나 아무 일도 일어나지 않는다! 소켓 예외를 catch하지 않습니다. 어떻게 처리 할 수 ​​있으며 그러한 행동의 원인은 무엇입니까?

+1

부탁드립니다. 고정 리터럴을 인쇄하는 것은 예외를 기록하는 수단으로 적합하지 않습니다. 자신의 메시지가 아닌 실제 예외를 기록하십시오. 그리고 isClosed() 테스트는 무의미합니다. null을 돌려주는 readLine()가 올바른 테스트입니다. 소켓을 닫고 SocketTimeoutException 이외의 IOException을 잡아 당겨서 중단해야하며 필요에 따라 어쩌면 중단해야합니다. – EJP

+0

스택 추적이 있습니다. 그것은 나타나서는 안될까? –

+0

나는 대답하지 않고 논평하고있다. – EJP

답변

3

SocketExceptioon이 (가) java.net.에있는 것이 아닙니다. 가져 오기를 확인하십시오.

또는 귀하가 생각하는 코드를 실행하고 있지 않습니다.

+0

java.net. * - 방금 확인했습니다. Eclipse에서 전체 애플리케이션으로 시작하는 경우 다른 코드를 어떻게 실행할 수 있습니까? Socket의 InputStream는이 클래스에서만 읽혀집니다. –

+0

OMG, 고마워. 그것은 아주 바보 같았습니다. 나는 그것을 변경하고 그 프로세스를 멈추지 않았다는 것을 잊지 마십시오.) 그럼에도 불구하고 IOException 절에 의해 왜 잡히지 않았습니까? 명시 적으로 SocketException 절을 명시한 경우에만 캐치됩니다. –

+0

당신이 그 코드를 실행하지 않았 으면 그 코드를 실행할 수 있다고 기대할 수 없습니다. – EJP

관련 문제