Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多播套接字-当计算机从睡眠中唤醒时将不工作_Java_Multicast - Fatal编程技术网

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

Java 多播套接字-当计算机从睡眠中唤醒时将不工作,java,multicast,Java,Multicast,大家好,我有一个多播套接字,正在接收数据包,工作正常 我有一个问题,当我的计算机从睡眠中醒来时,多播套接字无法工作。持续超时: MulticastSocket socket; \\initialise socket.. while (running) { try { synchronized (syncRoot) { socket.setSoTimeout(WAIT_TIME); socket.receive(recv); //Do Som

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

我有一个问题,当我的计算机从睡眠中醒来时,多播套接字无法工作。持续超时:

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%确定它在做什么,但套接字停止工作,但所有代码值都表示它们仍然处于活动状态)。但是,当代码从睡眠状态启动时,它认为它的多播套接字仍然连接,因此它很乐意继续侦听,但从未收到任何消息。事实上,它甚至很乐意在多socket上发送数据而不引发异常

因此,这个修复对每个人来说都不是完美的,但当我在一个多socket地址上发送和接收数据时,基本上如果我在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.
    }
}

这不是Java的问题。您是否打算将网络接口(电源管理网络设备)从睡眠中唤醒?当WOL设备处于睡眠状态时,它会变得被动,侦听并且不发送任何信息。您需要发送一个特殊的魔法包来唤醒它,如果它的魔法包功能被启用。您需要Jpcap来完成这种低级网络(或者有其他Java解决方案)。如果您不喜欢这个WOL功能,请关闭网络设备,这样设备在计算机睡眠时仍然可以工作。好的,还有其他Java解决方案(不使用Jpcap)发送神奇数据包来唤醒LAN设备,不断抛出什么异常?从哪一行代码?多播中没有连接。请解释一下你到底做了什么。因为你解决了你的问题,所以我结束了这篇文章,但是没有关于(1)问题是什么或者(2)你实际上是如何解决的真正细节,让这篇文章变得模棱两可。如果你想详细说明你的答案(也许还有这个问题,请注意收到的关于异常的评论),我非常乐意重新打开它。IGMP多播套接字中有连接。路由器管理每个IGMP多播套接字的保留。如果套接字未广播续订,则会将其从组中删除。