Dans ce tutorial, nous allons créer une application permettant de calculer le ping entre votre client et le serveur de socket distant.
Dans un premier temps, nous allons nous occuper de la partie serveur toujours basée sur le serveur de
ce tutorial. Nos explications seront en php puisque il s'agit du langage le plus rependu.
L'équivalent en perl est aussi disponible au bas de cette page. Globalement, le perl et le php sont assez proches pour pouvoir passer de l'un a l'autre facilement.
Voici donc la base de notre serveur :
<?php
$mainsock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_set_option($mainsock, SOL_SOCKET,SO_REUSEADDR, 1);
socket_bind($mainsock, "127.0.0.1", 22222) or die('Could not bind to address');
socket_listen($mainsock);
///////////////////
$clients=Array();
$compteur=0;
echo("En attente d'un client !\n");
while(true){
$toread=Array();
array_push($toread,$mainsock);
for ($i=0;$i<count($clients);$i++){ // pour tous les clients
array_push($toread,$clients[$i]["SOCKET"]);
}
socket_select($toread,$a=null,$a=null,$a=null);
if(in_array($mainsock, $toread)){// le mainsock est dans le tableau $toread.
// c'est notre mainsock donc un nouveau client
$sock=socket_accept($mainsock);
echo("Arrivée d'un nouveau client !\n");
$compteur++;
$nb=count($clients);
$clients[$nb]["SOCKET"]=$sock;
$clients[$nb]["UID"]=$compteur;
}else{
// c'est un client qui dit quelque chose
for ($i=0;$i<count($clients);$i++){ // on cherche le client
if(in_array($clients[$i]["SOCKET"], $toread)) { // celui la est dans le tableau toread
$input = socket_read($clients[$i]["SOCKET"], 1024);
if($input==null){
/// deconnection du client !
for ($j=0;$j<count($clients);$j++){ // on le cherche dans le tableau
if($clients[$j]==$clients[$i]){ // trouvé
echo("Deconnection du client ".$clients[$j]["UID"]."\n");
array_splice($clients,$j,1); // on le retire du tableau
$i--;
}
}
}else{
//////////////////////////////////////////////////Message d'un client
//////////////////////////////////////////////////
}
}
}
}
}
php?>
Dans le code ci-dessus nous avons mis en évidence (séparé par des ////) la zone dans laquelle nous allons travailler. Ce serveur se contentera de renvoyer le message à son destinataire. Nous utiliserons la fonction
socket_write() comme suit :
socket_write($clients[$i]["SOCKET"],$input);
A ce stade le serveur est prêt. Nous allons maintenant nous occuper du client flash. Pour faire simple, nous utiliserons une seule image clé qui contiendra le code et affichera notre interface. Pour tester le ping, il faut donc envoyer un message au serveur et mesurer combien de temps s'écoule jusqu'à la réception de ce même message depuis le serveur. Nous allons reprendre le code
de ce tutorial :
var socket = new XMLSocket()
socket.connect("127.0.0.1", 22222)
socket.onConnect = function(success){
}
socket.onData=function(msg){
}
Nous allons indiquer dans le
onConnect() si la connection s'est bien effectuée ou non :
socket.onConnect = function(success){
if(success){
txt_info.text="Connecté sur le port 22222 !"
}else{
txt_info.text="Impossible de se connecter au port 22222 !";
}
}
De la même façon, nous allons alerter l'internaute si la connection est perdue :
socket.onClose = function(){
txt_info.text="Connection perdue !"
}
Nous allons gérer l'envoie du message vers le serveur avec le bouton
bt_send :
bt_send.onRelease = function(){
socket.send(txt_message.text);
}
A ce moment il nous faut mémoriser depuis combien de temps le swf est lancé. On obtiens ce temps en millisecondes avec la fonction
getTimer() de flash. Nous allons donc déclarer une variable pour mémoriser ce temps et la mettre à jour à chaque click du bouton :
var timer=0
bt_send.onRelease = function(){
timer=getTimer();
socket.send(txt_message.text);
}
Nous attendons la réponse du serveur. Quand la réponse arrive, on calcule le temps qui s'est écoulé et on l'affiche dans le champs de texte
txt_result.
socket.onData=function(msg){
txt_result.text="Ping : "+(getTimer()-time)+" ms"
}
Et voila :-)
Au final, le code sur la première clé ressemble à ceci :
var timer=0
var socket = new XMLSocket()
socket.connect("127.0.0.1", 22222)
socket.onConnect = function(success){
if(success){
txt_info.text="Connecté sur le port 22222 !"
}else{
txt_info.text="Impossible de se connecter au port 22222 !";
}
}
socket.onClose = function(){
txt_info.text="Connection perdue !"
}
bt_send.onRelease = function(){
timer=getTimer();
socket.send(txt_message.text);
}
socket.onData=function(msg){
txt_result.text="Ping : "+(getTimer()-timer)+" ms"
}
Notez qu'en local, votre ping ne signifie pas grand chose et sera entre 0 et 2 ms. Personnellement, j'obtiens en ligne un ping de 40 ms avec ma freebox. Vous remarquerez aussi que si vous chargez énormément le champ de texte, votre ping sera plus lent. C'est normal puisque le message étant plus long, il met plus de temps à passer entre votre ordinateur et le serveur. On vois bien ici qu'il ne faut pas confondre entre ping et débit.
Vous pouvez télécharger le fla (ping.fla).