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

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

goul

Старожил
Пользователь
Баллы
103
Имя в Minecraft
goul
Никак не могу понять: что отсылает серверу скрипт\лаунчер и что получает в ответ? В одних скриптах отсылается одно, в других другое. Может, знающий человек мне объяснит, что к чему?
 
Сервер не предоставляет своего API для мониторинга, поэтому приходится идти окольными путями — имитировать запросы к серверу, подсматривать его логи, взаимодействовать через базу данных. Кто на что способен, коротко говоря. Смотря что надо, можно придумывать свой велосипед.
 
Смотря что надо, можно придумывать свой велосипед.
Ну, откопал вот такую ерунду. Спокойно показывает минимальное и максимальное кол - во человек. Там дальше есть другая обработка исключений, но нам оно пока - что не нужно.
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, '[') === 0 && strpos($this->IP, ']')===(strlen($this->IP)-1))
      $this->IP=trim($this->IP, '[]');
      fwrite($this->Socket, "\xfe");
     $Handle = fread($this->Socket, 1024);
     $Handle=substr($Handle, 1);
     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) {}
        }
    }
 
Там и там суть одна и та же — сформировать специального вида строчку, отправить ее майн-серверу, получить от сервера ответ. В ответе содержится MOTD, количество игроков на сервере, максимальное количество и еще какая-то чушь, не помню.

А код, кто как реализовал.
 
номер пакета ему отослать для 1.6.4 и менее, для 1.7.2 и далее уже новый метод.
 
С 1.3 до 1.6.4 такой ответ от сервера:
Код:
\u00a71\u000078\u00001.6.4\u0000A Minecraft 1.6.4 Server\u0000666\u0000666
Клиент отправляет MC|Ping. Щас покопаюсь как клиент отправляет.
 
Просто отправить серверу int 254, как я понял из кода java. В коде php отправка "\xfe". После чего получаем заветные данные.

Пробовал. Скорее всего, я неправильно играю с сокетами... Буду экспериментировать.
 

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

Назад
Верх