2012-08-14 60 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

相關問題