套接字接收设置超时

问题描述:

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

怎么办?

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

您需要等待一分钟或数据才能在插座上使用吗?如果你想等一整分钟,我会使用睡眠或休眠功能。这些将在持续一段时间后到期。如果您正在等待数据,我会查看select函数,这将允许您等待数据到达或一段时间到期,以先到者为准。 – Glenn 2012-04-07 17:02:30

+0

@Glenn睡眠可能会浪费一分钟。如果数据在一秒之后到达,该怎么办?你认为读超时是*,很难吗? – EJP 2017-05-08 00:38:22

您可以试试这个。按照您的方案中的要求更改套接字的超时值!此代码将发送一条消息,然后等待接收消息,直到达到超时!

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(); 
    } 
+0

对于读取超时,一秒太短。这个代码在发生超时时会立即抛出'SocketException:socket closed',因为缺少'break'。并非所有'SocketExceptions'表示套接字已关闭。 – EJP 2016-02-01 09:04:16

如果使用DatagramSocket,或Socket可以使用,

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

对于任何一个细节,你应该已经迈出DatagramSocket javadocSocket javadoc看看。

+1

'Socket.setSoTimeout'也存在。 – EJP 2017-05-08 00:39:03

+0

@EJP,谢谢。更正了答案。 – shibli049 2017-05-09 07:48:28

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