Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Java (https://forum.zone-game.info/forumdisplay.php?f=126)
-   -   Онлайн по соккету (https://forum.zone-game.info/showthread.php?t=23035)

Dementor 20.09.2012 13:45

Онлайн по соккету
 
Обрыскал весь форум/гугл и ничего не нашел. Помню по соккету как-то можно было узнать онлайн сервера. Не помню что надо отправить серверу.

Ashe 20.09.2012 13:53

Re: Онлайн по соккету
 
Цитата:

Сообщение от Неверный (Сообщение 228286)
Обрыскал весь форум/гугл и ничего не нашел. Помню по соккету как-то можно было узнать онлайн сервера. Не помню что надо отправить серверу.

Статус или число?

Dementor 20.09.2012 13:56

Re: Онлайн по соккету
 
Цитата:

Сообщение от Ashe (Сообщение 228292)
Статус или число?

не, статус и так понятно. Число )

Ashe 20.09.2012 14:12

Re: Онлайн по соккету
 
Но это для PTS.

<?  
class ServerStatus  
{  
   private $ip,$port,$interval,$timeout;  
 
   public function __construct($ip='127.0.0.1',$port=2106,$interval=30,$timeout=1)  
   {  
      $this->ip=$ip;  
      $this->port=$port;  
      $this->interval=$interval;  
      $this->timeout=$timeout;  
   }  
 
   public function GetStatusFromAuth()  
   {  
      $status=array();  
      $f=@fsockopen($this->ip,$this->port,$errno,$errstr,$this->timeout);  
      if ($f)  
      {  
         do  
         {  
            $sec=floor($this->timeout);  
            $msec=($this->timeout-$sec)*1000;  
            socket_set_timeout($f,$sec,$msec);  
 
            $buf=fread($f,2);  
            if (strlen($buf)!=2) break;  
            $a=unpack('vsize',$buf);  
            $size=$a['size']-2;  
            if ($size<1) break;  
 
            $buf=fread($f,$size);  
            if (strlen($buf)!=$size) break;  
 
            fwrite($f,"\x03\x00\xFE",3);  
 
            $buf=fread($f,2);  
            if (strlen($buf)!=2) break;  
            $a=unpack('vsize',$buf);  
            $size=$a['size']-2;  
            if ($size<1) break;  
 
            $buf=fread($f,$size);  
            if (strlen($buf)!=$size) break;  
 
            if (ord($buf[0])!=0xFE) break;  
            if (strlen($buf)<3) break;  
            $amount=ord($buf[1])+ord($buf[2])*256;  
            $buf=substr($buf,3);  
            if (strlen($buf)!=$amount*4) break;  
            $a=unpack('v'.($amount*2),$buf);  
            for ($i=0;$i<$amount;$i++) $status[$a[$i*2+1]]=$a[$i*2+2];  
         }  
         while (false);  
         fclose ($f);  
      }  
      return $status;  
   }  
 
   public function GetStatus()  
   {  
      $fn=dirname(__FILE__).'/status.txt';  
      $status=array();  
      fclose(fopen($fn,'a+b'));  
      $f=@fopen($fn,'r+b');  
      if ($f)  
      {  
         flock($f,LOCK_EX);  
         $cache=unserialize(fread($f,1024));  
         $status=@$cache['status'];  
         $time=@$cache['time'];  
         if (!IsSet($status) || !IsSet($time))  
         {  
            $status=array();  
            $time=0;  
         }  
         if (time()-$time>$this->interval)  
         {  
            $new=$this->GetStatusFromAuth();  
            foreach ($status as $id => $value)  
            {  
               $c=&$status[$id];  
               $c['on']=false;  
               $c['cur']=0;  
            }  
            foreach ($new as $id => $value)  
            {  
               if (!IsSet($status[$id])) $status[$id]=array('on'=>false,'cur'=>0,'max'=>0);  
               $c=&$status[$id];  
               $c['on']=true;  
               $c['cur']=$new[$id]; 
               if ($c['cur']>$c['max']) $c['max']=$c['cur'];  
            }  
            $cache=array('status'=>$status,'time'=>time());  
            $s=serialize($cache);  
            rewind($f);  
            ftruncate($f,0);  
            fwrite($f,$s,strlen($s));  
         }  
         fclose($f);  
      }  
      return $status;  
   }  
 
   public function GetText($id,$online,$offline)  
   {  
      $status=$this->GetStatus();  
      if (IsSet($status[$id])) 
      {  
      $c=&$status[$id]; 
      $c['cur']=$c['cur']+24; 
      $file = fopen("online.txt", "w"); 
        fwrite($file, $c['cur']); 
        fclose($file); 
      } 
      else  
      { 
      $c=array('on'=>false,'cur'=>0,'max'=>0);  
      } 
      $res=str_replace(array('%c','%m'),array($c['cur'],$c['max']),$c['on']?$online:$offline);  
      return $res;  
   }  
}  
 
$status=new ServerStatus('127.0.0.1');  
$online='%c';  
$offline='%c';  
echo $status->GetText(7,$online,$offline); 
?>
Code: PHP

4ipolino 20.09.2012 14:39

Re: Онлайн по соккету
 

Dementor 20.09.2012 16:32

Re: Онлайн по соккету
 
Цитата:

Сообщение от 4ipolino (Сообщение 228304)

но мне не для этого=) Мне для скрипта своего.


Текущее время: 02:09. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot