Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Serveur socket pour piloter une application

Envoyé par : jfr

Date : 28/04/2008 16:02

Bonjour,

xulrunner v1.8.1.3.

débutant mais ayant déjà pas mal lu la doc xul, je cherche à transmettre à mon application xul des commandes diverses. Je me suis donc orienté vers l'interface nsIServerSocket pour pondre le code qui suit (désolé, il est un peu long):

var serverSocket;
function start()
{
 var cmdlistener =
 {
   finished : function(data)
	{
		var args = data.split(" ");
		switch (args[0])
		{
			case "load":
			{
				var browser = document.getElementById("browser");
				browser.stop();
				browser.loadURI (args[1]);
				break;
			}
			case "exit":
			{
				window.close();
				break;
			}
			default:
				alert ("weird cmd: " + data);
				break;
		}
   }, 
   onSocketAccepted : function(socket, transport)
   {
     try {
       var outputString = "HTTP/1.1 200 OK\n"; 
       var stream = transport.openOutputStream(0,0,0);
       stream.write(outputString,outputString.length);
       var tinstream = transport.openInputStream(0,0,0);
			var instream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
			instream.init(tinstream);
       var dataListener = {
         data : "",
         onStartRequest: function(request, context){},
         onStopRequest: function(request, context, status){
           cmdlistener.finished(this.data);
       		stream.close();
         },
         onDataAvailable: function(request, context, inputStream, offset, count){
           this.data += instream.read(count);
         },
       }; 
       var pump = Components.classes["@mozilla.org/network/input-stream-pump;1"].createInstance(Components.interfaces.nsIInputStreamPump);
       pump.init(tinstream, -1, -1, 0, 0, true);
       pump.asyncRead(dataListener,null); 
     } catch(ex2){ alert (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(cmdlistener);
 } catch(ex){ alert(ex); }
}
function stop()
{
 if (serverSocket) serverSocket.close();
}
start ();

Mon soucis est qu'au bout de 30 ou 40 urls chargées toutes les 15 sec, xulrunner ne fait plus rien, et ne réagit d'ailleurs plus à rien.

Quelqu'un a-t'il déjà tenté/réussi ce type de serveur ?

Question subsidiaire, est-ce bien une voie raisonnable pour piloter mon application de l'extérieur ?

Jean-françois

# Re: Serveur socket pour piloter une application

Envoyé par : Paul Rouget

Date : 28/04/2008 17:30

Quelle version de xulrunner ? Tu peux aussi piloter ton application via un commandLineHandler.

# Re: Serveur socket pour piloter une application

Envoyé par : jfr

Date : 28/04/2008 17:43

xulrunner v1.8.1.3

# Re: Serveur socket pour piloter une application

Envoyé par : Paul Rouget

Date : 28/04/2008 18:37

Teste avec nightly de XulRunner 1.9

# Re: Serveur socket pour piloter une application

Envoyé par : jfr

Date : 29/04/2008 10:55

Bon, même punition avec une nightly 1.9. Je pense que mon code est foireux mais je ne vois pas trop où :-(

Pour ce qui est d'un commandLineHandler, cela veut-il dire que je peux m'en servir pour communiquer avec un process xulrunner existant ? J'arrive pas trop à me faire une idée à ce sujet (je vais en coder un mais un avis éclairé n'est pas de trop :-) ).

Jean-françois

# Re: Serveur socket pour piloter une application

Envoyé par : miso

Date : 29/04/2008 16:13

Décommentes onDataAvailable pour avoir un serveur ping J'ai été obligé de supprimer beaucoup de code pour pouvoir poster ça sur le forum, il faut donc certainement vérifier la syntaxe, mais sinon tout y est.

function test1() {
	if (trace == 1) window.dump("test1\n");
	function http_server() {

		var serverSocket;
		var connection_counter = 0;
		
		this.start = function()
		{
			if (trace == 1) window.dump("Entering start\n");
		  	var listener =
		  	{
		    	onSocketAccepted : function(socket, transport)
		    	{
		    		connection_counter++;
		      		try {
				        var outputString = "TEST\r\n";
		
						var stream = transport.openInputStream(0,0,0);
			    		var instream = Components.classes["@mozilla.org/scriptableinputstream;1"]
			      			 .createInstance(Components.interfaces.nsIScriptableInputStream);
		    		instream.init(stream);
		
			   			var os = transport.openOutputStream(1,0,0);
				        var charset = "UTF-8"; // Can be any character encoding name that Mozilla supports

						var outstream = Components.classes["@mozilla.org/intl/converter-output-stream;1"]
										.createInstance(Components.interfaces.nsIConverterOutputStream);
						
						// This assumes that fos is the nsIOutputStream you want to write to
						outstream.init(os, charset, 0, 0x0000);
				         outstream.writeString(outputString,outputString.length);

			
 			    		var dataListener = {
			      			data : "",
			      			data_length : 0,
			      			onStartRequest: function(request, context){},
 			      			onStopRequest:  function(request, context, status){
			        			instream.close();
			        			outstream.close();
			        			listener.finished(this.data);
			      			},
			      			onDataAvailable: function(request, context, inputStream, offset, count){
//			      				var str;
//			      				str = 'received count:' + count + "\n";
//			        			  outstream.write(str, str.length);
 			
			        			this.data = instream.read(count);
//			        			str = 'received data:' + this.data + "\n";
//			        			outstream.write(str, str.length);
			
//			      				str = 'received data.length:' + this.data.length + "\n";
//			        			outstream.write(str, str.length);
			        			
			    		};
			
			    		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){ 
						if (trace == 1) window.dump("onSocketAccepted Exception:" + ex2 +"\n");
				}
	    },

	    onStopListening : function(socket, status){
			if (trace == 1) window.dump("onStopListening\n");
	    }
	  };

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

		    serverSocket.init(listening_port,false,-1);
		    serverSocket.asyncListen(listener);
		  } 
		  catch(ex){ 
			if (trace == 1) window.dump("onSocketAccepted Exception 2: " + ex + "\n");
		  	dump(ex); 
		  }
		
		  if (trace == 1) window.dump("HTTP Server Started\n");
		}
	
		this.stop = function()
		{
		  if (serverSocket) serverSocket.close();
		  psyc_log("HTTP Server Stopped\n");
		}
	}

	if (trace == 1) window.dump("HTTP Server\n");

	httpd = new http_server();
	httpd.start();
}

# Re: Serveur socket pour piloter une application

Envoyé par : jfr

Date : 13/05/2008 11:07

Bon, ben, merci Miso; ton code plus le mien font des merveilles :-)

jfr

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.