Forums : XPCom

Aller à la discussion :  Plus récente Plus ancienne

# Boite noire en XUL - Socket - intermédiaire - Serversocket

Envoyé par : Ivory

Date : 21/02/2008 12:32

Bonjour,

Je suis nouveau sur ce forum et j'ai apprécié les réponses que vous fournissez sur les problèmes en XUL, je vais donc tenter de vous expliquer le mien le plus précisément possible.

  • L'application dont je dispose actuellement est développée en Javascript et utilise Comet, elle effectue ses requêtes vers un serveur Tomcat6. Ce fonctionnement à fait ses preuves.
  • Le but de mon application est de créer une sorte de "Boîte noire" qui permettrait à cette application d'avoir l'impression de dialoguer directement avec le serveur, mais les communications passent en fait (dans les deux sens) par ladite "boîte noire" qui est une extension xul.

Je m'explique : La boîte noire est un serveur de socket xul qui écoute sur un port. L'application tente une communication sur ce port : si elle réussit on passe par la boîte noire qui lui créera une socket destinée à la communication.

Mon problème: J'ai une sous fonction qui crée un flux de sortie sur la socket de communication, réponds à l'application et ferme le flux. J'ai une autre fonction, qui possède une socket spéciale qui est destinée à la communication avec le serveur et qui forward les données reçues au serveur.

Mais voilà! Seule la fonction que j'exécute en premier fonctionne, la deuxième est ignorée par le xul.

Je n'aime pas déranger les gens pour des petits problèmes, mais ca fait deux jours que je suis bloqué et j'aimerais bien avancer! Je vous suis très reconnaisant d'avance pour vos réponses.

# Re: Boite noire en XUL - Socket - intermédiaire - Serversocket

Envoyé par : Paul Rouget

Date : 21/02/2008 12:53

Qu'est ce que tu appelles ignoré ? As tu une exception quelconque ?

# Re: Boite noire en XUL - Socket - intermédiaire - Serversocket

Envoyé par : Ivory

Date : 21/02/2008 13:31

Non justement pas d'exception! Pourtant les blocs try catch sont bien présents partout.

ignoré --> Tous les console.log et les alert qui sont à l'intérieur de la deuxième fonction dans l'ordre d'exécution ne s'affichent pas. J'ai permuté les deux fonctions pour tester, et c'est toujours le même schéma, la deuxième fonction dans l'ordre d'exécution est ignorée. C'est ce point la qui me désarçonne.

# Re: Boite noire en XUL - Socket - intermédiaire - Serversocket

Envoyé par : Ivory

Date : 21/02/2008 13:43

En fait, tout ce qui est à l'intérieur du DataListener n'est pas pris en compte

@@/*********************************/ /* Démarrage de la server Socket */ /*********************************/

startServerSocket = function()
{
  var listener =
  {
    onSocketAccepted : function(socket, transport)
    {
	  //A chaque fois que l'on acceptera une socket, on en crée une nouvelle qui lira les données
      try {
		
		//Ici il faut une gestion de tout ce qui touche au clientId
		_lastClientId++;
		clientId = _lastClientId;
		_clientFrames[clientId] = transport;
		
		//A response is sent to tha application, in order to know which port it should use to communicate
		response =	"HTTP/1.1 200 OK\n"+
					"Content-type: test/json\n\n" +
					"{ frameId : " + clientId + ", portNumber : " + transport.port + " }";
		if(_clientFrames[clientId].isAlive()){
			console.log("Je réponds au client :"+clientId);
			//Ici on va renvoyer une réponse a l'application qui a le bon Id
                               sendToClient(response,clientId);
		}
		
		var dataListener = {
    	data : "",
	    onStartRequest: function(request, context){ console.log("OnStartRequest");},
	    onStopRequest: function(request, context, status){
			listener.finished(this.data);
			alert(this.data);

	      },    

	      onDataAvailable: function(request, context, inputStream, offset, count){
			this.data += instream.read(count);
                               sendToServer(this.data);



	      }
	    };
		//On initialise un inputstream pour lire les données recues
		stream = transport.openInputStream(0,0,0);
   		instream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
    	instream.init(stream);

    	var pump = Components.classes["@mozilla.org/network/input-stream-pump;1"].createInstance(Components.interfaces.nsIInputStreamPump);
	    pump.init(stream, -1, -1, 0, 0, false);
	    pump.asyncRead(dataListener,null);	
		
      }
	  catch(ex2){
		dump("::"+ex2);
	  }
    },

   	onStopListening : function(socket, status){}
  };

  try {
    serverSocket = Components.classes["@mozilla.org/network/server-socket;1"]
                     .createInstance(Components.interfaces.nsIServerSocket);

    serverSocket.init(7055,false,-1);
    serverSocket.asyncListen(listener);

  } catch(ex){ dump(ex); }
return null;
}@@

# Re: Boite noire en XUL - Socket - intermédiaire - Serversocket

Envoyé par : Ivory

Date : 21/02/2008 14:10

En fait je pense avoir trouvé la piste qu'il me manquait ; la réponse au transport.isAlive est donnée fausse une fois que j'ai fermé le Outputstream! Si je ne le ferme pas à l'intérieur de la routine, il est toujours "vivant après, mais du coup l'application ne reçoit pas la donnée.... Commme toujours un problème en cache un autre.

Est-il possible que l'appli recoive la donnée même si on ne ferme pas le stream?

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.