This question already has an answer here:
I have a UDP server listening packets from a client.
socket = new DatagramSocket(port);
while (isListen) {
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, 0, data.length);
socket.receive(packet);
}
The receive()
method will wait forever before a packet received. Is it possible to stop waiting for receiving? I can set a boolean
isListen
to stop the loop. On the other hand, if the socket is waiting then it will wait forever if no packet send from the client.
You can close the socket from another thread. The thread blocked in receive() will then throw an IOException.
You need to set a socket timeout with the setSoTimeout() method and catch
SocketTimeoutException
thrown by thesocket
'sreceive()
method when the timeout's been exceeded. After catching the exception you can keep using the socket for receiving packets. So utilizing the approach in a loop allows you to periodically (according to the timeout set) "interrupt" thereceive()
method call.Note that timeout must be enabled prior to entering the blocking operation.
An example (w.r.t your code):