Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Пинг другого севера в отдельном потоке

CraftCoder

Старожил
Пользователь
Баллы
108
Имя в Minecraft
CraftCoderr
Мне нужно пропинговать другой сервер minecraft(получить онлайн и мотд) и отобразить информацию на табличке, но вот соединение в главном потоке создавать опсано, а мир редактировать можно только из главного потока. Как пропинговать сервер в отдельном потоке, а потом вернуться в главный поток и отобразить на табличке инфу?
Если что, вот как собираю инфу:
Java:
try {
            Socket sock = new Socket(host.getAddress(), host.getPort());
            DataOutputStream out = new DataOutputStream(sock.getOutputStream());
            DataInputStream in = new DataInputStream(sock.getInputStream());
            out.write(0xFE);
            int b;
            StringBuffer str = new StringBuffer();
            while ((b = in.read()) != -1) {
                if (b != 0)
                str.append((char) b);
                else str.append('!');
            }
            String string = str.toString();
            //MGLobby.log.info(string);
            String[] data;
            if (string.contains("!!!")){
                data = string.split("!!!");
                return new PingResult(data[data.length - 3].replaceAll("!", ""), 
                        Integer.parseInt(data[data.length - 2].replaceAll("!", "")),
                        Integer.parseInt(data[data.length - 1].replaceAll("!", "")));
            } else {
                data = string.split("§");
                return new PingResult(data[1], Integer.parseInt(data[2].replaceAll("!", "")),
                        Integer.parseInt(data[3].replaceAll("!", "")));
            }
        } catch (Exception e){}
Может кто-то посоветует способ по-проще.
 
Для выполнения действий в основном потоке есть методы Bukkit.getScheduler().callSyncMethod(plugin, task) или банальный runTask
 
Для выполнения действий в основном потоке есть методы Bukkit.getScheduler().callSyncMethod(plugin, task) или банальный runTask
Ну так это ничего не меняет, будет так же фризиться главный поток.
 
Так ты запусти Thread, в нём сделай грязные делишки, а из него в конце вызови scheduler.runTask(new Runnable() { чистые делишки }) — оно выполнится на ближайшем серверном тике.
Java:
...
new Thread()
{
    @Override
    public void run()
    {
        /* ЗДЕСЬ МОЖНО ВИСНУТЬ ХОТЬ НА ПОЛЧАСА */
        getServer().getScheduler().runTask(BukkitPluginMain.this, new Runnable()
        {
            @Override
            public void run()
            {
                /* А ЭТО БУДЕТ ВЫЗВАНО НА БЛИЖАЙШЕМ СЕРВЕРНОМ ТИКЕ */
                /* НЕ СТОИТ НАГРУЖАТЬ ЦИКЛ ТЯЖКИМ ТРУДОМ ;) */
            }
        });
    }
}.start();
BukkitPluginMain.this — просто ссылка на экземпляр твоего плагина.
 
Так ты запусти Thread, в нём сделай грязные делишки, а из него в конце вызови scheduler.runTask(new Runnable() { чистые делишки }) — оно выполнится на ближайшем серверном тике.
Java:
...
new Thread()
{
    @Override
    public void run()
    {
        /* ЗДЕСЬ МОЖНО ВИСНУТЬ ХОТЬ НА ПОЛЧАСА */
        getServer().getScheduler().runTask(BukkitPluginMain.this, new Runnable()
        {
            @Override
            public void run()
            {
                /* А ЭТО БУДЕТ ВЫЗВАНО НА БЛИЖАЙШЕМ СЕРВЕРНОМ ТИКЕ */
                /* НЕ СТОИТ НАГРУЖАТЬ ЦИКЛ ТЯЖКИМ ТРУДОМ ;) */
            }
        });
    }
}.start();
BukkitPluginMain.this — просто ссылка на экземпляр твоего плагина.
Спасибо, можно было и не так подробно. Сейчас буду проверять.
 

Поделиться этой страницей

Назад
Верх