【发布时间】: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