#java #minecraft
Вопрос:
Итак, я пытаюсь перебрать ip-адреса в списке массивов, чтобы я мог пропинговать их и получить данные, однако время от времени я получаю ошибку автономного сервера, даже когда сервер подключен, когда я пропингую его отдельно. Я использую многопоточную среду. Также не может быть, чтобы сервер отвечал слишком долго, потому что я увеличил время ожидания, и раздельная отправка 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
Комментарии:
1. Вы ничего не можете здесь сделать. Это проблема вне вашего кода (при условии, что адрес указан правильно). Лучше всего установить тайм-аут и поймать ошибку, возможно, попробовать еще раз, а затем пропустить этот сервер.
2. Примечание: Всегда ли это одни и те же серверы? Если вы звоните слишком часто, вы можете попасть в черный список (временно/постоянно). Попробуйте распределить свои соединения или использовать меньшее количество потоков и посмотрите, поможет ли это.
Ответ №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, что и вы, он создавал «Исключение соединения». Ваш API, похоже, зависит от «исключения SocketTimeoutException«. Итак, я добавляю еще одну область обработки.