套接字接收设置超时
问题描述:
我想发送数据到服务器,然后等待一分钟的答案,然后关闭套接字。套接字接收设置超时
怎么办?
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();
}
+0
对于读取超时,一秒太短。这个代码在发生超时时会立即抛出'SocketException:socket closed',因为缺少'break'。并非所有'SocketExceptions'表示套接字已关闭。 – EJP 2016-02-01 09:04:16
答
如果使用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();
您需要等待一分钟或数据才能在插座上使用吗?如果你想等一整分钟,我会使用睡眠或休眠功能。这些将在持续一段时间后到期。如果您正在等待数据,我会查看select函数,这将允许您等待数据到达或一段时间到期,以先到者为准。 – Glenn 2012-04-07 17:02:30
@Glenn睡眠可能会浪费一分钟。如果数据在一秒之后到达,该怎么办?你认为读超时是*,很难吗? – EJP 2017-05-08 00:38:22