2014-01-10 53 views
2

在我的Android應用程序中,我發送UDP數據包,並使用此代碼等待特定的一個。當它到達時,我不需要再聽。但是,它處於「接收模式」,當我調用socket.close()時,它會引發異常。不知怎的,我應該阻止它。如何在接收狀態下關閉DatagramSocket

如何在沒有異常情況下停止接收?

socket.send(packet); 
     Log.w(Tags.DEBUG, "Sent"); 

     while (shouldRunning) 
     { 
     byte[] buf = new byte[1024]; 
     DatagramPacket packet2 = new DatagramPacket(buf, buf.length); 
     Log.w(Tags.DEBUG, "Receive start"); 
     //if (socket != null && !socket.isClosed()) 
     { 
      socket.receive(packet2); 
      Log.w(Tags.DEBUG, "ADDR" + packet2.getAddress().toString()); 
      String data = String.valueOf(packet2.getData()); 
      Log.w(Tags.DEBUG, "Data: " + data); 
      if (data.equals(Tags.SPEC1)) 
      shouldRunning= false; 
     } 
     //else 
      //shouldRunning= false; 
     } 

我關閉套接字這樣:

@Override 
    protected void onCancelled() 
    { 
    if (socket != null) 
    { 
     //socket.disconnect(); 
     shouldRunning=false; 
     socket.close(); 
     socket = null; 
    } 
    } 

我得到這個異常:

java.net.SocketException異常:插座在org.apache.harmony關閉
.luni.platform.OSNetworkSystem.recv(Native Method)at dalvik.system.BlockGuard $ WrappedNetworkSystem.recv(BlockGuard.java:321) 在 org.apache.harmony.luni.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:172) 在 org.apache.harmony.luni.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:181) 在java的。 net.DatagramSocket.receive(DatagramSocket.java:402)
在com.example.Data.DataAsyncTask.Networking(DataAsyncTask.java:745)

回答

1

你應該把超時插座上:

socket.setSoTimeout(1000); 

SocketTimeoutException繼續while循環。完成後shouldRunning==true在while循環終止後關閉套接字。

OnCancelled()應該只設置標誌。

+0

我會盡力,謝謝。有沒有不涉及任何異常的方法? :) – Nestor

+0

沒有(檢查)異常?這是Java ;-) – PeterMmm

+0

你是對的:) – Nestor

相關問題