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

Помогите Как работает мониторинг

Тема в разделе "[Архив] Помощь", создана пользователем goul, 10 ноя 2013.

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

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

    Баллы:
    103
    Skype:
    goul1995
    Имя в Minecraft:
    goul
    Никак не могу понять: что отсылает серверу скрипт\лаунчер и что получает в ответ? В одних скриптах отсылается одно, в других другое. Может, знающий человек мне объяснит, что к чему?
     
  2. Хостинг MineCraft
    <
  3. Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    Сервер не предоставляет своего API для мониторинга, поэтому приходится идти окольными путями — имитировать запросы к серверу, подсматривать его логи, взаимодействовать через базу данных. Кто на что способен, коротко говоря. Смотря что надо, можно придумывать свой велосипед.
     
    Сникерсни и slavik123123123 нравится это.
  4. Автор темы
    goul

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

    Баллы:
    103
    Skype:
    goul1995
    Имя в Minecraft:
    goul
    Ну, откопал вот такую ерунду. Спокойно показывает минимальное и максимальное кол - во человек. Там дальше есть другая обработка исключений, но нам оно пока - что не нужно.
    PHP:
    public function __construct($IP$Port$timeout) {
      
    $this->IP $IP;
      
    $this->Port $Port;
      
    $this->to $timeout;
      if(
    $this->Socket = @stream_socket_client('tcp://'.$this->IP.':'.$Port$this->to)) {
          if(
    strpos($this->IP'[') === && strpos($this->IP']')===(strlen($this->IP)-1))
          
    $this->IP=trim($this->IP'[]');
          
    fwrite($this->Socket"\xfe");
         
    $Handle fread($this->Socket1024);
         
    $Handle=substr($Handle1);
         if(
    strpos($Handle,"\x00\x00")!=0){
           
    $Handle explode("\x00\x00",$Handle);
           
    $Handle str_replace("\x00"''$Handle);
           
    $this->MOTD=$Handle[3];
           
    $this->CurPlayers=$Handle[4];
           
    $this->MaxPlayers=$Handle[5];
         }else{
            
    Handle=explode("\xa7"$Handle);$Handle=str_replace("\x00"''$Handle);
            
    $this->MOTD=$Handle[0];$this->CurPlayers=$Handle[1];$this->MaxPlayers=$Handle[2];
                 }
    unset(
    $Handle);  fclose($this->Socket);
                        }
    }


    И тут же пример на Java, который тоже прекрасно работает. И везде разная ересь. Если PhP я хоть немного понял, то в Java после " soc = new Socket(); " пошёл темный лес.
    Код:
    public static String[] pollServer(String ip, int port)
        {
            Socket soc = null;
            DataInputStream dis = null;
            DataOutputStream dos = null;
    
            try
            {
                soc = new Socket();
                soc.setSoTimeout(6000);
                soc.setTcpNoDelay(true);
                soc.setTrafficClass(18);
                soc.connect(new InetSocketAddress(ip, port), 6000);
                dis = new DataInputStream(soc.getInputStream());
                dos = new DataOutputStream(soc.getOutputStream());
                dos.write(254);
    
                if (dis.read() != 255)
                {
                    throw new IOException("Bad message");
                }
                String servc = readString(dis, 256);
                servc.substring(3);
                if (servc.substring(0,1).equalsIgnoreCase("§") && servc.substring(1,2).equalsIgnoreCase("1"))
                {
                    servtype = 1;
                    return servc.split("\u0000");
    
                }
                else
                {
                    servtype = 2;
                    return servc.split("§");
                }
    
            } catch (Exception e)
            {
                return new String[] { null, null, null };
            } finally
            {
                try { dis.close();  } catch (Exception e) {}
                try { dos.close();  } catch (Exception e) {}
                try { soc.close();  } catch (Exception e) {}
            }
        }
    
    
     
  5. Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    Там и там суть одна и та же — сформировать специального вида строчку, отправить ее майн-серверу, получить от сервера ответ. В ответе содержится MOTD, количество игроков на сервере, максимальное количество и еще какая-то чушь, не помню.

    А код, кто как реализовал.
     
  6. Автор темы
    goul

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

    Баллы:
    103
    Skype:
    goul1995
    Имя в Minecraft:
    goul
    В этой строчке-то и вся соль. Что только не пробовал и какими угодно способами, у меня не работает. ЧТО именно ему отсылать?
     
  7. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    номер пакета ему отослать для 1.6.4 и менее, для 1.7.2 и далее уже новый метод.
     
    goul нравится это.
  8. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    С 1.3 до 1.6.4 такой ответ от сервера:
    Код:
    \u00a71\u000078\u00001.6.4\u0000A Minecraft 1.6.4 Server\u0000666\u0000666
    Клиент отправляет MC|Ping. Щас покопаюсь как клиент отправляет.
     
    goul нравится это.
  9. Автор темы
    goul

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

    Баллы:
    103
    Skype:
    goul1995
    Имя в Minecraft:
    goul
    Очень ждём-с
     
  10. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Просто отправить серверу int 254, как я понял из кода java. В коде php отправка "\xfe". После чего получаем заветные данные.
     
    goul нравится это.
  11. Автор темы
    goul

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

    Баллы:
    103
    Skype:
    goul1995
    Имя в Minecraft:
    goul
    Пробовал. Скорее всего, я неправильно играю с сокетами... Буду экспериментировать.
     

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