我试着写一个简单的程序,它实时告诉我是否有互联网连接。这就是我正在做的事情:
import java.net.Socket;
public class InternetConnection {
public static void main(String[] args) {
String inetAddress = "www.google.com";
int port = 80;
while (true) {
try {
Socket socket = new Socket(inetAddress, port);
System.out.println("Connected to the internet");
} catch (Exception e) {
System.out.println("Not connected to the internet");
}
}
}
}
如果到达www.google.com
,则打印出所需的消息。但是,如果我故意断开互联网以检查它是否有效,它会打印" 未连接到互联网"然后我重新连接并显示" 连接到互联网",但当我再次断开连接时,它仍会显示消息" 已连接到互联网"。我不知道自己做错了什么......
P.S。我知道这不是检查是否有互联网连接的最佳方式。
答案 0 :(得分:0)
在创建套接字并打印连接消息后设置延迟时间。
try {
Socket socket = new Socket(inetAddress,port);
System.out.println("Connected to the internet");
}catch(Exception e){
System.out.println("Not connected to the internet");
}
TimeUnit.SECONDS.sleep(5);
您的计划应按预期运作。
答案 1 :(得分:0)
您收到UnknownHostException,因为如果您尝试连接并拔出插件,则谷歌的DNS查找将失败。如果你没有#34;没有主办方的路线"它也应该直接抛出。在你的代码中,你没有超时处理,你应该至少使用你可以提供给你的Socket构造函数的连接超时参数(参见https://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#connect(java.net.SocketAddress,%20int)),即使很多问题都会直接抛出(更多细节,例如这里{{ 3}})。此外,您的单个运行时线程在出现问题时会被阻止,它只会挂在您的
上Socket socket = new Socket(inetAddress, port);
并且通常有套接字和互联网连接的麻烦..您希望能够以受控方式结束执行,在一个单独的线程中运行您的程序,您可以在控制方式,可能你想要安排测试,而不是只是睡觉",像
private final static ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
..
Runnable r = () -> {
try {
testConnections();
} catch (InterruptedException | ExecutionException | TimeoutException e) {
// HANDLE IT
}
};
scheduler.scheduleAtFixedRate(r, secondsInBetweenPolls, secondsInBetweenPolls, TimeUnit.SECONDS);
}
..
另外,我会选择一个非阻塞的CompletableFuture,非常适合这种东西 - 你可以在这里阅读它:connect() method ignoring its timeout value。然后主要块可能是
private void testConnections() throws InterruptedException, ExecutionException, TimeoutException {
for (URL u : urls) {
if (isRunning){
try{
CompletableFuture.supplyAsync(() -> testConnection(u)).acceptEither(timeoutAfter(millisConnectionTimeOut, TimeUnit.MILLISECONDS), result -> currentStatus = result).get();
} catch (Exception e) {
if (e instanceof TimeoutException) {
currentStatus = Result.INTERNET_UNREACHABLE;
}
}
if (currentStatus.equals(Result.INTERNET_REACHED)) {
break; // first actual internet hit is enough, right?
}
}
}
notifyListener();
lastStatus = currentStatus;
}
private void notifyListener() {
if (lastStatus == null || !currentStatus.equals(lastStatus)) {
if (currentStatus.equals(Result.INTERNET_REACHED)) {
listener.connectionIsUp();
} else {
listener.connectionIsDown();
}
}
}
private Result testConnection(URL url) {
if (isRunning) {
HttpURLConnection urlConnect = null;
try {
urlConnect = (HttpURLConnection) url.openConnection();
urlConnect.setConnectTimeout(millisConnectionTimeOut);
int resultCode = urlConnect.getResponseCode();
if (resultCode == 200) {
return Result.INTERNET_REACHED;
}
} catch (IOException ignore) {}
} finally {
if (urlConnect != null) {
urlConnect.disconnect();
}
}
}
return Result.INTERNET_UNREACHABLE;
}