2016-11-07 248 views
5

我遇到問題當我的應用連接到WiFi網絡時運行網絡服務。 我在openPort()方法得到一個以下異常,Android機器不在網絡上

java.net.SocketException: socket failed: ENONET (Machine is not on the network)波紋管

的BroadcastReceiver

@Override 
public void onReceive(Context context, Intent intent) { 

    String action = intent.getAction(); 

    if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 

     NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 

     if (networkInfo.getState() == NetworkInfo.State.CONNECTED) { 
      welcomeService = new BroadcastService(context, "Welcome"); 
      Log.i(TAG, "onReceive: SUPPLICANT-STATE ---> Connected"); 
      //do something 
      if (!serviceRegistered) { 
       welcomeService.registerService(); 
       serviceRegistered = true; 
      } 
     } 

     if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED) { 
      Log.i(TAG, "onReceive: SUPPLICANT-STATE ---> Disconnected"); 
      //do something 
      unRegisterService(); 
     } 
    } 

} 

public void unRegisterService() { 
    if (serviceRegistered && welcomeService != null) { 
     welcomeService.unregisterService(); 
     serviceRegistered = false; 

    } 
} 

BroadcastService

public void registerService() { 
    NsdServiceInfo serviceInfo = new NsdServiceInfo(); 
    serviceInfo.setServiceName(mServiceName); 
    serviceInfo.setServiceType("_http._tcp."); 
    serviceInfo.setPort(openPort()); 

    mNsdManager = (NsdManager) mContext.getSystemService(Context.NSD_SERVICE); 

    mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener); 
} 

private int openPort() { 
    try{ 
     // Line that throws the exception 
     return new ServerSocket(0).getLocalPort(); 
    }catch (IOException ioe){ 
     Crashlytics.logException(ioe); 
     ioe.printStackTrace(); 
     return 0; 
    } 
} 

這廣播接收機ONL y在主要活動顯示時運行。它在第一次運行時工作正常,但是當我更換WiFi網絡時發生這種情況。幫助世界不勝感激。

+0

面臨同樣的問題 –

+0

@NinadKambli網絡是否有互聯網連接。因爲我的問題是由於連接到沒有互聯網和android選擇的網絡而導致使用3/4G連接,而不是我試圖與之通信的設備無法連接 – Lonergan6275

+0

問題已解決。我限制了我的設備只通過wifi發送數據,即使網絡上的無線網絡已關閉,並且我忘記了在用戶連接到移動數據時禁用它。 –

回答

0

使用服務,服務啓動和停止服務時,網絡會被更改或停機時network.Also檢查這是第一,你要onStartCommand()任何port.Do的任務,使用後使用版本相同的端口。

@Override 
public void onReceive(Context context, Intent intent) { 
    Date now = new Date(); 
    Long time = now.getTime(); 
    String action = intent.getAction(); 



    NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 

    if (networkInfo.getState() == NetworkInfo.State.CONNECTED) { 


    boolean check = isMyServiceRunning(context, 
    service.getName()); 
    if (check) { 
     Intent i = new Intent(sqlitewraper.context,service.class); 
     stopService(i); 
    } 
    else{ 
     Intent i = new Intent(sqlitewraper.context,service.class); 
     startservice(i); 

    } 

    } 

    if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED) { 

    boolean check = isMyServiceRunning(context, 
    service.getName()); 
    if (check) { 
     Intent i = new Intent(sqlitewraper.context,service.class); 
     stopService(i); 
    } 
    } 


    private boolean isMyServiceRunning(Context context, String Myservice) { 
    ActivityManager manager = (ActivityManager) context 
    .getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager 
    .getRunningServices(Integer.MAX_VALUE)) { 
     if (Myservice.equals(service.service.getClassName())) { 

     return true; 
     } 
    } 
    return false; 
    } 
} 
+0

謝謝你的回答,但你可以請詳細解釋一下,或舉一個例子 – Lonergan6275

+0

我看不到這是如何解決'新的ServerSocket(0).getLocalPort();' – Lonergan6275

+0

問題,因爲已經發布的資源已經如果您在網絡更改時停止服務,則會在服務啓動時分配,然後分配已釋放的資源。 –