【问题标题】:Android Machine is not on the networkAndroid机器不在网络上
【发布时间】:2017-03-20 15:57:58
【问题描述】:

当我的应用连接到 WiFi 网络时,我在运行网络服务时遇到问题。 我收到以下异常,

java.net.SocketException: socket failed: ENONET (Machine is not on the network) 在下面的 openPort() 方法中

广播接收器

@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;

    }
}

广播服务

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;
    }
}

广播接收器仅在显示主要活动时运行。它在第一次运行时运行良好,但是当我更改 WiFi 网络时会发生这种情况。非常感谢帮助世界。

【问题讨论】:

  • 面临同样的问题
  • @NinadKambli 网络是否有互联网连接。因为我的问题是由连接到没有互联网的网络引起的,而 android 选择使用 3/4G 连接,而不是我试图与之通信的设备无法访问
  • 问题已解决。我限制我的设备仅通过 wifi 发送数据,即使 wifi 上的网络已关闭并且当用户连接到移动数据时我忘记禁用它。
  • 在我的情况下,是对ConnectivityManager.bindProcessToNetwork() 的调用导致了问题。使用null 参数再次调用此方法解决了问题。
  • @Lonergan6275 我遇到了同样的问题。但它不能再次发生,我仍然不知道它为什么会发生以及如何解决它。你能告诉我你的分析吗?

标签: java android serversocket


【解决方案1】:

当网络发生变化或停止网络时,使用启动服务和停止服务的服务。还检查首先使用发布的相同端口,然后使用该端口。在onStartCommand() 中执行您想要的任何任务。

@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;
  }
}

【讨论】:

  • 感谢您的回答,但能否请您更详细地解释一下或举个例子
  • 我看不出这是如何解决new ServerSocket(0).getLocalPort();的问题
  • 它是因为在服务启动时释放资源已经分配,​​如果您在网络改变时停止服务,那么它的释放资源已经分配。
  • 我认为 manager.getRunningServices(Integer.MAX_VALUE) 不会返回 NSDManager(网络发现)服务。
  • 这并不能解决问题。问题是应用程序无法与主机通信 `socket failed: ENONET (Machine is not on the network)`。如果我杀死该应用程序并再次运行它,它就可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 2014-10-15
  • 2019-08-25
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
相关资源
最近更新 更多