多播套接字 - 当计算机从睡眠中唤醒时将无法工作

时间:2012-08-14 01:14:52

标签: java multicast

大家好,我有一个接收数据包的多播套接字,工作正常。

我遇到了一个问题,但是当我的计算机从睡眠状态唤醒时,多播套接字无效。不断超时:

MulticastSocket socket;
\\initialise socket..
while (running) {
try {
    synchronized (syncRoot) {
        socket.setSoTimeout(WAIT_TIME);
        socket.receive(recv);
        //Do Something...
    }
} catch (SocketTimeoutException e) {
}

目前,当我的计算机从Windows睡眠模式唤醒时,如果我没有发送数据包,它会不断抛出套接字异常。 我检查了变量socket.isBound(),socket.isClosed(),socket.isConnected(),它们从工作时没有改变。我错过了一个变量吗? 即使套接字正在工作,它也会返回isConnected()= false,isBound()= true,isClosed()= false。

我是否需要做一些事情,比如计算SocketTimeoutExceptions的数量,如果我得到10然后重新初始化我的多播套接字?

1 个答案:

答案 0 :(得分:0)

因此,当我的mutlicast套接字发送和接收时,如果您没有收到刚刚在10秒内发送的数据包,我决定在那里进行检查,然后重新启动套接字连接。这很好。

更新回答:2012/09/06

EJB正如你所说没有连接但是当Windows进入休眠状态时它会关闭网络适配器或其他东西(不是100%确定它正在做什么但是套接字停止工作但所有代码值都表示它们仍处于活动状态)。但是代码在从睡眠状态启动时所做的是它认为它的多播套接字仍然是连接的,因此它很乐意继续监听但从未收到任何东西。事实上,它甚至很高兴在多重插座上发送数据而不会抛出异常。

所以这个修复并不适合所有人,但因为我在一个多串口地址上发送和接收数据,基本上如果我在10秒内没有收到我发送的数据包,我会认为出了问题并重新启动连接。这是一段代码,它解释了我是如何做到的:

MulticastSocket socket;
\\initialise socket..
while (running) {
try {
    synchronized (syncRoot) {
    if (sendMessagesQueue.size() > 0) {
        lastOutBoundMessage = sendMessagesQueue.remove();
        byte[] msg = lastOutBoundMessage.toByte();
        DatagramPacket outboundPacket = new DatagramPacket(
            msg, msg.length, group,
            socket.getLocalPort());
        synchronized (syncRoot) {
            socket.send(outboundPacket);
            lastSentMessage = DateTime.now();
        }

        socket.setSoTimeout(WAIT_TIME);
        socket.receive(recv);

        // Compare lastOutBoundMessage  and recv
        // if same set values to null
        // lastSentMessage = null;
        // lastOutBoundMessage = null;
    }
} catch (SocketTimeoutException e) {
    if (lastSentMessage != null && lastSentMessage.plusSeconds(10).isBeforeNow()) {
        running = false;
        // restart thread so connection will start again.
    }
}