난 당신이에게 쉬운 방법을 구현했던 가정거야 :
DatagramSocket s = new DatagramSocket(port);
DatagramPacket p = new DatagramPacket(new byte[256], 256);
s.receive(p);
지금, Javadoc을보고 해 InterruptedException을 던져 DatagramSocket.receive()
를 얻을 수있는 방법은 없습니다. 소켓을 닫는 것이 듣기를 멈추게하는 유일한 방법입니다.
보다 나은 구현은 DatagramSocket.setSoTimeout(int)
을 2 초와 같이 작은 것으로 사용하여 DatagramSocket에서 시간 초과를 설정 한 다음 서버가 중단되었는지 확인하는 것이 었습니다. 따라서 서버 코드에 대해 다음과 같이 끝낼 것입니다 (예외 처리는하지 않음).
DatagramSocket s = new DatagramSocket(port);
s.setSoTimeout(2000); // 2 second time out
while(running){ // boolean running flag, check for interrupt here
try{
DatagramPacket p = new DatagramPacket(new byte[256], 256);
s.receive(p);
//do stuff
} catch (SocketTimeoutException e){
//timed out
}
}//end while
연결을 수신하는 데 사용하는 코드를 게시 할 수 있습니까? 그것은 다음과 같습니다 : while (running) {sock = sSock.accept(); ...}? –
* interrupt() *는 소켓 읽기 또는 쓰기와 같은 I/O 작업을 인터럽트하는 데 사용할 수 없습니다. I/O를 중단하려면 소켓을 닫는 것이 좋습니다. 스레드가 IOException을 수신 한 후 스레드가 [중단됨]인지 확인해야합니다 (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#isInterrupted%28%29). 그러는 동안 정상적으로 종료하십시오. – JimmyB
@HannoBinder, 답안에 이것을 넣었어야합니다. 왜 코드가 옳은지에 대한 훌륭한 설명입니다. –