Nouvelle version d’Oregano server 1.1.2

Pour les besoins d’Expantion, j’ai du modifier le serveur de socket Oregano. La première chose que j’ai modifié, est l’intégration du patch de Jens Halm sur le problème de connections persistantes. La deuxième chose concerne l’ajout d’un port d’admin pouvant être attaqué depuis le serveur par différents langages. La problématique que j’avais était la suivante. Expantion étant partiellement un jeu au tour par tour, j’avais besoin qu’a la fin du calcule du tour, le serveur puisse pusher certaines info aux clients flash connectés. J’avais également besoin de pouvoir pusher de la même façon n’importe quoi à n’importe quel moment. Par exemple si j’ai envie de faire tomber la nuit d’un coup. Pour cela cette version d’oregano a un nouveau port d’ouvert, le 1890. Ce port est de type telnet et attend une connexion. Une fois la connexion établie, il attend un message et coupe la connexion après réception de celui-ci. Les messages sont du type suivant :

serverEvent monEvent

Ici monEvent va etre dispatché à tous les joueurs connectés à oregano via org.omus.msg.Messenger.

Coté flash il ne reste plus qu’a implémenter un comportement en rapport avec monEvent.

Trêve de blabla, voici un exemple concret : Pour la partie cliente, j’ai créé une classe qui va se charger d’établir la connexion avec oregano en PHP.

@@<?php /* OreganoAdmin 0.1 by David Mouton based on PHPTELNET class by Antone Roundy public domain */ class OreganoAdmin { 	var $show_connect_error=1; 	var $use_usleep=0;	// change to 1 for faster execution 		// don't change to 1 on Windows servers unless you have PHP 5 	var $sleeptime=125000; 	var $loginsleeptime=1000000; 	var $fp=NULL; 	var $loginprompt; 	var $conn1; 	var $conn2; 	/* 	0 = success 	1 = couldn't open network connection 	2 = unknown host 	3 = login failed 	4 = PHP version too low 	*/ 	function Connect($server,$port) { 		$rv=0; 		$vers=explode('.',PHP_VERSION); 		$needvers=array(4,3,0); 		$j=count($vers); 		$k=count($needvers); 		if ($k<$j) $j=$k; 		for ($i=0;$i<$j;$i++) { 			if (($vers$i+0)>$needvers$i) break; 			if (($vers$i+0)<$needvers$i) { 				$this->ConnectError(4); 				return 4; 			} 		} 		$this->Disconnect(); 		if (strlen($server)) { 			if (preg_match('/^0-9./',$server)) { 				$ip=gethostbyname($server); 				if ($ip==$server) { 					$ip=''; 					$rv=2; 				} 			} else $ip=$server; 		} else $ip='127.0.0.1'; 		if (strlen($ip)) { 			if ($this->fp=fsockopen($ip,$port)) { 			} else $rv=1; 		} 		if ($rv) $this->ConnectError($rv); 		return $rv; 	} 	function Disconnect($exit=1) { 		if ($this->fp) { 			if ($exit) $this->DoCommand('exit',$junk); 			fclose($this->fp); 			$this->fp=NULL; 		} 	} 	function DoCommand($c,&$r) { 		if ($this->fp) { 			fputs($this->fp,"$c\r"); 			$this->Sleep(); 			$this->GetResponse($r); 			$r=preg_replace("/^.*?\n(.*)\n^\n*$/","$1",$r); 		} 		return $this->fp?1:0; 	} 	function GetResponse(&$r) { 		$r=''; 		do { 			$r.=fread($this->fp,1000); 			$s=socket_get_status($this->fp); 		} while ($s'unread_bytes'); 	} 	function Sleep() { 		if ($this->use_usleep) usleep($this->sleeptime); 		else sleep(1); 	} 	function OreganoAdmin() { 		$this->conn1=chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB). 			chr(0x20).chr(0xFF).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB). 			chr(0x27).chr(0xFF).chr(0xFD).chr(0x01).chr(0xFF).chr(0xFB). 			chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC). 			chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA). 			chr(0x1F).chr(0x00).chr(0x50).chr(0x00).chr(0x18).chr(0xFF). 			chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).chr(0x00).chr(0x33). 			chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33). 			chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0). 			chr(0xFF).chr(0xFA).chr(0x27).chr(0x00).chr(0xFF).chr(0xF0). 			chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(0x58).chr(0x54). 			chr(0x45).chr(0x52).chr(0x4D).chr(0xFF).chr(0xF0); 		$this->conn2=chr(0xFF).chr(0xFC).chr(0x01).chr(0xFF).chr(0xFC). 			chr(0x22).chr(0xFF).chr(0xFE).chr(0x05).chr(0xFF).chr(0xFC).chr(0x21); 	} 	function ConnectError($num) { 		if ($this->show_connect_error) switch ($num) { 		case 1: echo '<br />PHP Telnet <a href="http://www.geckotribe.com/php-telnet/errors/fsockopen.php">Connect failed: Unable to open network connection</a><br />'; break; 		case 2: echo '<br />PHP Telnet <a href="http://www.geckotribe.com/php-telnet/errors/unknown-host.php">Connect failed: Unknown host</a><br />'; break; 		case 3: echo '<br />PHP Telnet <a href="http://www.geckotribe.com/php-telnet/errors/login.php">Connect failed: Login failed</a><br />'; break; 		case 4: echo '<br />PHP Telnet <a href="http://www.geckotribe.com/php-telnet/errors/php-version.php">Connect failed: Your server\'s PHP version is too low for PHP Telnet</a><br />'; break; 		} 	} } ?>@@

Une application PHP va s’écrire comme ceci :

@@<?php require_once "OreganoAdmin.php"; $telnet = new OreganoAdmin(); $result = $telnet->Connect('127.0.0.1','1890'); echo $result; if ($result == 0) { $telnet->DoCommand('serverEvent KICKALL', $result); echo $result; } ?>@@

Enfin coté client flash nous allons faire ceci pour intercepter l’évent et le traiter :

@@public function init():Void{ 		trace("OreganoUtils : Initialisation"); 		//On ecoute le messager 		var ecouteur:Object = ; 		ecouteur.onMessage = Delegate.create(this,receiveMessage); 		Messenger.getInstance().addListener(ecouteur); 	} private function receiveMessage(recepMsg:Message):Void{ 		trace("OreganoUtils : Receiving message..."); 		if(recepMsg.getSubject() == "KICKALL"){ 			trace("OreganoUtils : Reception d'un status : KICKALL"); 			//DO ACTION HERE 		} 	}@@

Je proposerais prochainement une version plus élaborée du système, plus dynamique au niveau de Oregano, comme la possibilité de configurer la chose, celle de faire des extensions, etc …

Telecharger archive RAR

One Response to “Nouvelle version d’Oregano server 1.1.2”

  1. Arrangeur dit :

    Hello ! Bille- très pertinent ;) cependant j’ai du mal à vcomprendre : "comme la possibilite de configurer la chose" … bonne continyuation ! :)

Leave a Reply