나는 간단한 것을 이해할 수 없다. 소켓 입력을 처리하는 클래스가 있습니다.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하지 않습니다. 어떻게 처리 할 수 있으며 그러한 행동의 원인은 무엇입니까?
부탁드립니다. 고정 리터럴을 인쇄하는 것은 예외를 기록하는 수단으로 적합하지 않습니다. 자신의 메시지가 아닌 실제 예외를 기록하십시오. 그리고 isClosed() 테스트는 무의미합니다. null을 돌려주는 readLine()가 올바른 테스트입니다. 소켓을 닫고 SocketTimeoutException 이외의 IOException을 잡아 당겨서 중단해야하며 필요에 따라 어쩌면 중단해야합니다. – EJP
스택 추적이 있습니다. 그것은 나타나서는 안될까? –
나는 대답하지 않고 논평하고있다. – EJP