установить таймаут для приема сокетов

Я хочу отправить данные на сервер, а затем ждать ответа в течение одной минуты, а затем закрыть сокет.

Как это сделать?

DatagramPacket sendpack = new ......; socket.send(pack); DatagramPacket recievepack = new .....; //wait 1 minute{ socket.recieve(buf); //wait 1 minute} socket.close(); 

Вы можете попробовать это. Измените тайм-аут сокета, как требуется в вашем сценарии! Этот код отправит сообщение, а затем дождитесь получения сообщений до тех пор, пока не будет достигнут тайм-аут!

 DatagramSocket s; try { s = new DatagramSocket(); byte[] buf = new byte[1000]; DatagramPacket dp = new DatagramPacket(buf, buf.length); InetAddress hostAddress = InetAddress.getByName("localhost"); String outString = "Say hi"; // message to send buf = outString.getBytes(); DatagramPacket out = new DatagramPacket(buf, buf.length, hostAddress, 9999); s.send(out); // send to the server s.setSoTimeout(1000); // set the timeout in millisecounds. while(true){ // recieve data until timeout try { s.receive(dp); String rcvd = "rcvd from " + dp.getAddress() + ", " + dp.getPort() + ": "+ new String(dp.getData(), 0, dp.getLength()); System.out.println(rcvd); } catch (SocketTimeoutException e) { // timeout exception. System.out.println("Timeout reached!!! " + e); s.close(); } } } catch (SocketException e1) { // TODO Auto-generated catch block //e1.printStackTrace(); System.out.println("Socket closed " + e1); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Если вы используете DatagramSocket или Socket, который вы можете использовать,

 socket.setSoTimeout(1000); //the value is in milliseconds 

Для любой детали вы должны были взглянуть на jatadoc или Socket javadoc в DatagramSocket .

Чтобы прояснить комментарий EJP, это то, что он имел в виду под «отсутствующим break », вызывающим SocketException.

 String group = "224.0.0.0"; int port = 5000; MulticastSocket recvSock = new MulticastSocket(port); recvSock.joinGroup(InetAddress.getByName(group)); recvSock.setSoTimeout(1000); while(true) { try { recvSock.receive(in); } catch (SocketTimeoutException e) { break; // Closing here would cause a SocketException } } // Move the close() outside the try catch bloock recvSock.leaveGroup(InetAddress.getByName(group)); recvSock.close();