设置套接字接收超时时间

12

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

如何实现?

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

你需要等待一分钟或者数据在套接字上可用吗?如果你想要等待整整一分钟,我会使用sleep或usleep函数。它们将在时间到期之前暂停一段时间。如果你正在等待数据,我会研究select函数,它将允许你等待数据到达或一段时间到期,以先到者为准。 - Glenn
@Glenn 睡眠可能浪费长达一分钟的时间。如果数据在一秒钟后到达怎么办?你认为读取超时是用来做什么的,确切地说? - user207421
3个回答

25

您可以尝试这个。根据您的情况更改套接字的超时时间!此代码将发送一条消息,然后等待接收消息,直到达到超时时间为止!

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

一秒钟对于读取超时来说太短了。由于缺少break,此代码将在超时发生时立即抛出SocketException: socket closed异常。并非所有的SocketExceptions都意味着套接字已关闭。 - user207421

10

1
Socket.setSoTimeout 也是存在的。 - user207421

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接