设置套接字接收超时

我想将数据发送到服务器,然后等待一分钟的答案,然后关闭套接字。

怎么做?

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 

有关任何细节,您应该查看DatagramSocket javadoc或Socket javadoc 。

为了澄清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();