JAVA 用 InetAddress 指定端口

2023-11-26

我正在使用 InetAddress 来确定我的服务器是否在线。

如果服务器离线,它将重新启动服务器。

此过程每 5 分钟循环一次,以再次检查服务器是否在线。

它工作正常,但现在我需要弄清楚如何指定在检查服务器状态时使用端口 43594 而不是默认端口 80。

谢谢!这是我的代码:

import java.net.InetAddress;
public class Test extends Thread {
    public static void main(String args[]) {
        try {
            while (true) {
                try
                {
                    InetAddress address = InetAddress.getByName("cloudnine1999.no-ip.org");
                    boolean reachable = address.isReachable(10000);
                    if(reachable){
                        System.out.println("Online");
                    }
                    else{
                        System.out.println("Offline: Restarting Server...");
                        Runtime.getRuntime().exec("cmd /c start start.bat");
                    }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                Thread.sleep(5 * 60 * 1000);
            }
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

EDIT:

好吧,所以我接受了别人的建议,然后就做到了这一点。但现在当我取消注释这一行时..Runtime.getRuntime().exec("cmd /c start start.bat");

我收到这个错误..

error: unreported exception IOException; must be caught or declared to be thrown

这是我当前的代码:

import java.net.*;
import java.io.*;
public class Test extends Thread {
    public static void main(String args[]) {
        try {
            while (true) {
                SocketAddress sockaddr = new InetSocketAddress("cloudnine1999.no-ip.org", 43594);
                Socket socket = new Socket();
                boolean online = true;
                try {
                    socket.connect(sockaddr, 10000);
                }
                catch (IOException IOException) {
                    online = false;
        }
                if(!online){
            System.out.println("OFFLINE: Restarting Server..");
            //Runtime.getRuntime().exec("cmd /c start start.bat");
        }
                if(online){
                    System.out.println("ONLINE");
                }
                Thread.sleep(1 * 10000);
            }
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

正如我在评论中已经提到的,根据JavadocisReachable 的实现方式不允许您控制所选端口。实际上,如果系统权限允许这样做,它只会对机器执行 ping 操作(ICMP 请求)。

手动执行此操作(即使用套接字)肯定会起作用,并且实际上并不会更复杂和/或更长时间:

SocketAddress sockaddr = new InetSocketAddress("cloudnine1999.no-ip.org", 43594);
// Create your socket
Socket socket = new Socket();
boolean online = true;
// Connect with 10 s timeout
try {
    socket.connect(sockaddr, 10000);
} catch (SocketTimeoutException stex) {
    // treating timeout errors separately from other io exceptions
    // may make sense
    online=false;
} catch (IOException iOException) {
    online = false;    
} finally {
    // As the close() operation can also throw an IOException
    // it must caught here
    try {
        socket.close();
    } catch (IOException ex) {
        // feel free to do something moderately useful here, eg log the event
    }

}
// Now, in your initial version all kinds of exceptions were swallowed by
// that "catch (Exception e)".  You also need to handle the IOException
// exec() could throw:
if(!online){
    System.out.println("OFFLINE: Restarting Server..");
    try {
        Runtime.getRuntime().exec("cmd /c start start.bat");
    } catch (IOException ex) {
         System.out.println("Restarting Server FAILED due to an exception " + ex.getMessage());
    }
}        

编辑:忘记处理IOException补充说,这也意味着服务器无法运行

EDIT2:添加了 close() 可以抛出的 IOException 的处理

EDIT3:以及 exec() 的异常处理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA 用 InetAddress 指定端口 的相关文章

随机推荐

  • 查询两个不同表中两个字段的 SUM

    我正在尝试确定如何在两个表之间求和字段 在表 1 中 我们简称为 gegevens 例如 我会使用 gegevenID vertrekdatum prijs 在表 2 中 我们将其称为费用 例如 feeID gegevenID 金额 我想根
  • Gradle 构建时在 APK META-INF 中复制的重复文件

    我一直在环顾四周一些答案在这里发布了有关此错误的信息 但没有运气 我希望得到一些有关正在发生的事情的澄清 我的错误如下 错误 任务 app transformResourcesWithMergeJavaResForDebug 执行失败 co
  • 如何通过角度2中的Router.navigate传递RouteData

    agnular2 中是否有一个 api 允许传递 json 对象而不是字符串值 例如 在Router navigate 我可以传递路由参数 Router navigate routename key stringvalue 并可以使用检索它
  • ic_sync_black_24dp.xml 的 android.content.res.Resources$NotFoundException

    我已经为此苦苦挣扎了一个多星期 因为我认为这一定与我的环境有关 但我无法缩小范围 我启动一个空项目 添加一个 空白 活动并接受所有默认值 项目完成设置后 我添加一个 设置 活动 在 MainActivity java 中 我添加两行代码来连
  • Qt5内存泄漏?如何删除QMimeData?

    我刚刚提供了一个答案this问题并想提供一个工作示例 当我注意到新创建的QMimeData返回的实例QListModel mimeData 在应用程序终止之前不会被删除 所以这不是一个real由于 Qt 处理所有内存泄漏QMimeData关
  • 如何在 Android 模拟器上模拟硬件媒体控制按钮

    Android 支持耳机和连接设备上的硬件播放 暂停按钮 我正在尝试找到一种方法来测试模拟器上对这些设备的支持 这安卓文档讨论如何添加对硬件播放控件的支持 但不幸的是 我找不到有关如何模拟它们的文档 谢谢 您可以使用 adb 发送按键事件
  • 如何使用 d3.js 计算给定 x 的 y 值

    我定义了一个线生成器d3 js如下 var line d3 svg line interpolate monotone x function d return x d date y function d return y0 d visits
  • 更新 Java HashMap 键

    我只是想知道 如果 a 的 key 会发生什么HashMap是可变的 下面的测试程序证明了这一点 我无法理解何时两者都等于并且hashCode方法返回 true 和相同的值 为什么hashmap containsKey return fal
  • Init方法继承

    如果我有带有 init 方法的抽象类 A abstract class A init println Hello 然后扩展 A 的 B 类 class B A 如果我像这样实例化 B fun main args Array
  • 如何返回指向ctypes结构体的指针?

    我尝试将一个结构指针传递给函数 bar 作为函数 foo write 的返回值 但我收到行 foo POINTER temp foo 的错误消息 TypeError 必须是 ctypes 类型 在里面ctypes在线帮助我发现 ctypes
  • 安装ffi(1.1.2)时出错,Bundler无法继续

    在 Rails 3 0 项目中运行 OSX Mountain Lion 当尝试在 Rails 项目中使用捆绑器更新我的 gems 时 出现以下错误 An error occured while installing ffi 1 1 2 an
  • Linux 内核中的 hrtimer 重复任务

    我的目标是使用以下命令在 Linux 内核中创建一个重复任务hrtimer结构 我希望它每 500 毫秒重复一次 但是 我有点困惑如何hrtimer在 Linux 内核中工作 参见linux hrtimer h 我知道时间已指定 回调应该返
  • 加载报道会话时出错(代码 5001)

    当我尝试使用 EclEmma 检查覆盖率时出现以下错误 请帮助我 加载报道会话时出错 代码 5001 错误同时 分析包片段 roo t java at F solo repository target test classes 代码 500
  • 无法解决 WindowsError: [Error 2] 系统找不到指定的文件

    我正在尝试重命名目录中的所有图片 我需要在文件名中添加几个前置零 我是 Python 新手 我编写了以下脚本 import os path c tmp dirList os listdir path for fname in dirList
  • psycopg2 copy_expert() - 如何复制 gzipped csv 文件?

    如果我的表是 schema one table Five 并且我的文件名是 file to import csv gz 我应该为 copy expert cmd 提供什么参数才能将文件内容复制到表中 这就是我正在尝试的 this copy
  • Clojure(读取行)不等待输入

    我正在用 Clojure 编写一个文本游戏 我希望玩家在控制台上输入行 然后游戏逐行响应 研究表明 read line 是一种从 Clojure 中的标准输入获取文本行的方式 但它对我不起作用 我在一个新的 Leiningen 项目中 并且
  • Android Visualizer 类抛出运行时异常

    我在演示应用程序中使用 AndroidFX Visualizer 类来读取 FFT 但是当我尝试创建该类的对象时 它会抛出运行时异常 java lang RuntimeException Cannot initialize Visualiz
  • 转换为 int 与下限

    这些之间有什么区别吗 float foo1 int bar 3 0 float foo2 floor bar 3 0 据我了解 这两种情况都有相同的结果 编译后的代码有什么不同吗 转换为 int 将会截断为零 floor 将向负无穷截断 这
  • 在 OpenCV java 中声明 Mat

    如何使用 Java OpenCV 创建和分配 Mat C 版本来自这一页 is Mat C Mat
  • JAVA 用 InetAddress 指定端口

    我正在使用 InetAddress 来确定我的服务器是否在线 如果服务器离线 它将重新启动服务器 此过程每 5 分钟循环一次 以再次检查服务器是否在线 它工作正常 但现在我需要弄清楚如何指定在检查服务器状态时使用端口 43594 而不是默认