2012-08-14 64 views
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。

我需要做的是这样算SocketTimeoutExceptions的数量,如果我得到10然后重新初始化我的播套接字?

+0

这不是Java问题。您是否打算从睡眠中唤醒网络接口(电源管理网络设备)?当WOL设备正在睡觉时,它变为被动,听不到任何东西。如果启用了Magic Packet功能,则需要发送特殊的魔法数据包才能将其唤醒。你需要Jpcap来做这个低级网络(或者有其他的Java解决方案)。关于它的更多信息,请点击http://www.activexperts.com/activsocket/tutorials/wol/如果您不喜欢这种WOL功能,只需关闭网络设备即可,以便设备在电脑休眠时仍能工作。 – 2012-08-14 02:18:48

+0

好了,还有其他的Java解决方案(不使用JPCAP)发送魔术包以唤醒LAN设备http://www.jibble.org/wake-on-lan/ – 2012-08-14 02:24:36

+0

不断抛出什么异常?从哪行代码? – EJP 2012-08-14 22:55:52

回答

0

所以我的mutlicast插座发送和接收我决定把支票在那里,如果你不接受,你刚才发送10秒内然后重新启动套接字连接的数据包。这工作得很好。

更新应答:2012/09/06

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

所以这个修复不适合每个人,但因为我在一个multisocket地址上发送和接收数据,基本上如果我在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. 
    } 
} 
+0

多播中没有连接。请解释你实际做了什么。 – EJP 2012-08-14 22:56:55

+0

因为你解决了你的问题,所以我关闭了它,但是没有真正的细节来说明(1)问题是什么或者(2)你是如何真正解决它的,而是让它变得模糊不清。如果你想详细说明你的答案(也许这个问题,注意到关于例外的意见),我会很乐意重新开放这个。 – 2012-08-15 01:24:24

+0

在IGMP多播套接字中有连接。路由器管理每个IGMP多播套接字的预留。如果套接字未广播续订,它将从组中移除。 – 2012-12-16 01:11:59

相关问题