2013-10-01 52 views
1

我正在寫一個Android應用程序,其通過MulticastSocket時通信。它基本上正常工作,但我遇到了一個奇怪的錯誤:無論何時連接中斷和恢復(例如設備短暫失去WiFi連接),該應用程序仍然可以發送但不接收任何內容。當發送其他設備接收數據包時,但是當其他設備發送數據包時,設備不會收到它們。MulticastSocket時可以發送但不能接收

我已經驗證接收線程仍然在正常運行。它卡在socket.receive中。增加套接字超時並沒有幫助,它只是使接收超時而不接收任何東西。

當我關閉並重新打開了和MulticastSocket再次一切工作正常。我註冊了BroadcastReceiver進行連接更改,當連接丟失和恢復時會進行重新連接。這有點緩解了這個問題,但當連接在另一個點被中斷時(例如,重新啓動服務器),它仍然會發生。

所以我要麼需要修復的socket.receive或可靠地發現當插座無法接收任何數據包以關閉並重新打開它。有什麼建議麼?

代碼:

private MulticastSocket socket; 

public void open() throws IOException { 
    socket = new MulticastSocket(serverAddress.getPort()); 
    socket.joinGroup(serverAddress.getAddress()); 

    receiver = new Receiver(); 
    receiver.start(); 
} 

private void send(MyPacket packet) throws IOException { 
    if (socket == null) 
     throw new IOException("Connection closed"); 

    DatagramPacket datagramPacket = 
      new DatagramPacket(packet.getBuffer(), packet.getSize(), serverAddress); 
    socket.send(datagramPacket); 
} 

private class Receiver extends Thread { 
    @Override 
    public void run() { 
     while (!closing) { 
      if (socket == null) 
       return; 

      try { 
       socket.receive(packet); 
      } catch (IOException e) { 
       close("IOException in receiver thread", e); 
       return; 
      } 

      onPacketReceived(packet); 
     } 
    } 
} 

回答

0

犯規如果當WiFi下降最多可以檢測到,我會建議離開並重新加入組,而不是關閉並重新打開插座。

相關問題