0

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

我遇到了一个问题,当我的计算机从睡眠中唤醒时,多播套接字不起作用。不断超时:

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,我是否需要计算 SocketTimeoutExceptions 的数量,然后重新初始化我的多播套接字?

4

1 回答 1

0

因此,当我的多播套接字发送和接收时,我决定在那里检查,如果您在 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.
    }
}
于 2012-08-14T22:52:22.857 回答