多播套接字 - 当计算机从睡眠状态唤醒时将不起作用



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

我遇到了一个问题,当我的计算机从睡眠状态唤醒时,组播套接字不起作用。持续超时:

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。

如果我得到 10,我是否需要计算 SocketTimeoutException 的数量,然后重新初始化我的多播套接字?

因此,

当我的多播套接字发送和接收时,如果您没有收到刚刚在 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.
    }
}

最新更新