2017-12-28 71 views
0

이제 내 게임을위한 간단한 UDP 서버/클라이언트 시스템을 만들었습니다. 이 데이터가 전송 될 때까지 기다리는 방법의 코드입니다 :자바 네트워킹 블로킹 방법과 while 루프

while (handler.isRunning()) { 
    byte[] data = new byte[1024]; 
    DatagramPacket packet = new DatagramPacket(data, data.length); 
    try { 
     socket.receive(packet); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("Server - " + new String(data).trim()); 

} 
socket.close(); 

그래서 것은이 게임이 isRunning는()가 false로 설정됩니다 것을 의미 닫을 때, 모든 스레드는 제외 사망 서버 및 클라이언트. 이유는 여기에 socket.receive() 메소드가 차단되어 적어도 하나 이상의 패킷을 받아야 isRunning()이 true인지 종료되었는지 확인해야하기 때문입니다. 그래서 게임을 끝내고 나면,이 스레드가 패킷을 더 이상 수신하지 않고 즉시 죽어 버리고 싶습니다.하지만 그 일을하는 방법을 모른다. 도움을 주셔서 감사합니다.

답변

2

몇 가지 옵션이 있습니다. 먼저, 가장 간단한 옵션은 시간 초과를 설정하는 것입니다 : https://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html#setSoTimeout(int).

다음으로는 콜백 및 비동기 I/O를 사용하는 옵션이 있습니다. 보십시오 java.nio.channels.DatagramChannel

+0

감사합니다. 하지만 여전히 질문이 있습니다. 패킷을받은 후 매번 시간 제한을 설정해야합니까, 아니면 한 번만합니까? – Joza100

+0

나는 그것을 이해했다! – Joza100

1

응답 된 here. 귀하의 사례와 유사 DatagramSocket.receive

+0

하지만 여기서 문제는 다른 곳에서 가까이 다가 갈 수 없다는 것입니다. 그것은 단지 전체 코드를 조직화되지 않게 만들 것입니다. 하지만 다른 대답은 내가 타임 아웃을 사용할 수 있도록 타임 아웃을 사용하라고했습니다! 어쨌든이 답변을 주셔서 감사합니다! – Joza100