Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем CraftCoder, 1 июн 2015.

  1. Автор темы
    CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Мне нужно пропинговать другой сервер minecraft(получить онлайн и мотд) и отобразить информацию на табличке, но вот соединение в главном потоке создавать опсано, а мир редактировать можно только из главного потока. Как пропинговать сервер в отдельном потоке, а потом вернуться в главный поток и отобразить на табличке инфу?
    Если что, вот как собираю инфу:
    Код:
    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){}
    
    Может кто-то посоветует способ по-проще.
     
  2. Хостинг MineCraft
    <
  3. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Для выполнения действий в основном потоке есть методы Bukkit.getScheduler().callSyncMethod(plugin, task) или банальный runTask
     
  4. Автор темы
    CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Ну так это ничего не меняет, будет так же фризиться главный поток.
     
  5. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Так ты запусти Thread, в нём сделай грязные делишки, а из него в конце вызови scheduler.runTask(new Runnable() { чистые делишки }) — оно выполнится на ближайшем серверном тике.[DOUBLEPOST=1433157853,1433157604][/DOUBLEPOST]
    Код:
    ...
    new Thread()
    {
        @Override
        public void run()
        {
            /* ЗДЕСЬ МОЖНО ВИСНУТЬ ХОТЬ НА ПОЛЧАСА */
            getServer().getScheduler().runTask(BukkitPluginMain.this, new Runnable()
            {
                @Override
                public void run()
                {
                    /* А ЭТО БУДЕТ ВЫЗВАНО НА БЛИЖАЙШЕМ СЕРВЕРНОМ ТИКЕ */
                    /* НЕ СТОИТ НАГРУЖАТЬ ЦИКЛ ТЯЖКИМ ТРУДОМ ;) */
                }
            });
        }
    }.start();
    BukkitPluginMain.this — просто ссылка на экземпляр твоего плагина.
     
  6. Автор темы
    CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Спасибо, можно было и не так подробно. Сейчас буду проверять.
     
  7. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Если в потоке нужно дождаться завершения синхронного кусочка, а потом продолжить всякие параллельные дела, можно поступить так.
     

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