【问题标题】:Pinging server returns offline occasionally java MinecraftPinging 服务器偶尔会离线返回 java Minecraft
【发布时间】:2021-11-08 04:05:10
【问题描述】:

所以,我尝试遍历 arraylist 中的 ipaddresses,以便我可以 ping 它们并获取数据,但是,即使当我单独 ping 服务器在线时,我也会偶尔出现脱机服务器错误。我使用多线程环境。也不可能是服务器回复时间过长,因为我增加了超时长度并且单独 ping ip 没有问题。任何帮助表示赞赏


public class PingServer implements Runnable {
    private String serverip;
    public PingServer(String ip) {
        this.serverip = ip;
    }
    public void run() {

        try {
            MinecraftPingReply data = new MinecraftPing().getPing(new MinecraftPingOptions().setHostname(serverip).setPort(25565));
            //sending
            String servercount = data.getPlayers().getOnline() + "/" + data.getPlayers().getMax();


          System.out.println(serverip + " " + servercount + " pineapple");



        } catch (IOException |  IllegalStateException | IllegalArgumentException | JsonSyntaxException exception){
            System.out.println("offline" + serverip + “ ” + exception);
        }


    }
}



java.net.SocketTimeoutException: Connect timed out
    at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:546)
    at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:333)
    at java.base/java.net.Socket.connect(Socket.java:645)
    at com.corporate.utils.mcping.MinecraftPing.getPing(MinecraftPing.java:66)
    at com.corporate.database.refresh.ReplaceDataDB.run(ReplaceDataDB.java:36)
    at java.base/java.lang.Thread.run(Thread.java:831)
Exception in thread "Thread-16145" java.lang.NullPointerException

【问题讨论】:

  • 这里无能为力。这是您的代码之外的问题(假设地址是正确的)。最好的办法是设置超时并捕获错误,也许再试一次,然后跳过该服务器。
  • 注意:总是相同的服务器吗?如果您过于频繁地 ping,那么您可能会被列入黑名单(暂时/永久)。尝试间隔连接,或使用更少的线程,看看是否有帮助。

标签: java minecraft


【解决方案1】:

当服务器离线时,并且您知道这不是您的故障(即代码错误/错误 IP...),您可以忽略它。

我建议你做这样的事情,来管理谁处理了哪些错误:

try {
    // here you code
    online = true;
} catch (UnsupportedOperationException e) {
    e.printStackTrace(); // here it's your code that create error
} catch (ConnectException | SocketTimeoutException e) {
    // server offline
    online = false;
} catch (Exception e) { // all others issues
    getLogger().severe("Server " + key + " create an error:");
    e.printStackTrace();
}

在我的情况下,例如我没有使用与您相同的 API,它正在生成“ConnectException”。您的 API 似乎依赖于“SocketTimeoutException”。因此,我添加了另一个处理程序区域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 2021-05-14
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多