2017-12-28 2 views
0

Ich habe jetzt ein einfaches UDP-Server/Client-System für mein Spiel. Dies ist der Code der Methode, die auf Daten wartet, um es zu senden:Java Networking Blocking-Methoden und While-Schleife

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(); 

, ist die Sache also, wenn das Spiel schließt bedeutet, dass isRunning() auf false gesetzt wird, sterben alle Themen mit Ausnahme der Server und Client. Der Grund dafür ist, dass hier die socket.receive() -Methode blockiert und mindestens ein weiteres Paket empfangen muss, um zu überprüfen, ob isRunning() wahr ist, und zu beenden. Also, nachdem ich das Spiel beendet habe, möchte ich, dass dieser Thread sofort stirbt, ohne weitere Pakete zu empfangen, aber ich weiß nicht, wie ich das machen soll! Danke für die Hilfe

Antwort

2

Es gibt ein paar Optionen. Zuerst ist die einfachste Option, ein Timeout festzulegen: https://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html#setSoTimeout(int).

Als nächstes können Callbacks und Async-E/A verwendet werden. Werfen Sie einen Blick auf java.nio.channels.DatagramChannel

+0

Danke. Aber ich habe noch eine Frage. Muss ich jedes Mal ein Zeitlimit setzen, nachdem ich ein Paket erhalten habe, oder ich mache es nur einmal? – Joza100

+0

Ich habe es herausgefunden! – Joza100

1

Beantwortet here. Ähnlich für Ihren Fall für DatagramSocket.receive

+0

Aber das Problem ist, dass ich von keinem anderen Ort aus anrufen kann. Es würde nur meinen ganzen Code unorganisiert machen. Aber die andere Antwort sagte mir, dass ich die Zeitüberschreitung verwenden soll, damit ich die Timeouts nutzen kann! Danke für diese Antwort sowieso! – Joza100