如何用Java检查当前是否有网络连接?

72

如何通过Java检查是否可以连接到互联网?一种方法是:

final URL url = new URL("http://www.google.com");
final URLConnection conn = url.openConnection();
... if we got here, we should have net ...

但是有没有更适合执行这项任务的东西,特别是如果您需要经常进行连续检查,而且失去互联网连接的可能性非常高?


答案与许多其他相同形式的问题的答案相同。确定任何资源是否可用的唯一正确方法是在正常执行过程中尝试使用它,并在发生故障时进行处理。任何其他技术都是一种或另一种尝试预测未来的形式。 - user207421
18个回答

3

1) 确定您的应用程序需要连接到哪里。

2) 设置一个工作进程来检查InetAddress.isReachable,以监视与该地址的连接。


2
public boolean checkInternetConnection()
{
     boolean status = false;
     Socket sock = new Socket();
     InetSocketAddress address = new InetSocketAddress("www.google.com", 80);

     try
     {
        sock.connect(address, 3000);
        if(sock.isConnected()) status = true;
     }
     catch(Exception e)
     {
         status = false;       
     }
     finally
     {
        try
         {
            sock.close();
         }
         catch(Exception e){}
     }

     return status;
}

2

这段代码包含在我用于测试连接是否可用的jUnit测试类中。我总是能够获得连接,但如果您检查内容长度,如果不知道,则应该为-1:

  try {
    URL url = new URL("http://www.google.com");
    URLConnection connection = url.openConnection();

    if(connection.getContentLength() == -1){
          fail("Failed to verify connection");
    }
  } 
  catch (IOException e) {
      fail("Failed to open a connection");
      e.printStackTrace();
  }

有些服务器返回-1作为内容长度(甚至完全省略头部!),尽管网页在浏览器中正常加载,因为它们使用替代的内容传输方案来传递网页,所以这个答案对于所有网站来说都不准确。 更好的验证连接的方法是尝试在一个新线程中读取响应数据(可以指定一个可选的最大超时时间),这样如果服务器确实关闭,你将不会收到任何响应数据,而如果它只是慢了,你也不会被卡在等待数据的过程中,同时你的程序还想做其他事情。 - Brian_Entei
有些服务器返回-1作为内容长度(甚至完全省略头部!),尽管网页在浏览器中正常加载,因为它们使用替代的内容传输方案来传递网页,所以这个答案对所有网站都不准确。 更好的验证连接的方法是尝试在一个新的线程中读取响应数据(可以指定一个可选的最大超时时间),这样如果服务器确实宕机,你就不会收到任何响应数据,如果服务器正常但速度较慢,你也不会在等待数据的同时被卡住,而你的程序需要做其他事情。 - undefined

0

现在有针对这个的API,但它们是平台特定的:

(如果有可用的特定工具,我会使用它们)


0

你可以简单地写成这样

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Main {

    private static final String HOST = "localhost";

    public static void main(String[] args) throws UnknownHostException {

        boolean isConnected = !HOST.equals(InetAddress.getLocalHost().getHostAddress().toString());

        if (isConnected) System.out.println("Connected");
        else System.out.println("Not connected");

    }
}

0

这对我很有效。

try{  
        InetAddress addr = InetAddress.getByName("google.com" );
        
    }catch(IOException e){
        JOptionPane.showMessageDialog(new JFrame(),"No Internet connection.\nTry again later", "Network Error", JOptionPane.ERROR_MESSAGE);    
    }

-3
以下代码片段允许我们获取 Android 设备上网络的状态。
public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TextView mtv=findViewById(R.id.textv);
            ConnectivityManager connectivityManager=
                  (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if(((Network)connectivityManager.getActiveNetwork())!=null)
                    mtv.setText("true");
                else
                    mtv.setText("fasle");
            }
        }
    }

欢迎来到StackOverflow。请始终包括文本描述。另外,看起来你只是从上下文中提取了一些代码,其中包括与问题无关的代码。您使他人必须花费更多的工作去解密您帖子中隐藏的信息,这样你就会对大家的帮助越少。这只用于Android吗? - Jeff Learman

-3

还有一个Gradle选项--offline,可能会产生您想要的行为。


2
这似乎与问题无关。 - mkobit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接