IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

CORBA Discussion :

Thread java à convertir en Corba


Sujet :

CORBA

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Thread java à convertir en Corba
    Bonjour à tous,

    Je suis novice en Corba (juste lu des cours et des tutoriels), et je dois remplacer une application existante (qui est en java avec des Threads et des sockets) en une communication CORBA.
    Le programme est un annuaire qui permet que lorsque le client demande un nom, le serveur lui retourne un numéro de telephone et une adresse. Le client peut aussi ajouter un nom dans le serveur.

    Le hic, c'est que je ne vois pas du tout comment partir. Par exemple, quoi mettre dans mon fichier IDL.
    J'ai essayé de "bricoler" quelque chose, mais je ne vois pas comment faire passer un flux entre le client et le serveur en corba (lire et écrire dedans).
    Je met en annexe le code de mon client et de mon serveur si ça peut servir.
    Bien sûr, je ne demande pas qu'on m'écrive le code ... Je voudrais juste avoir des pistes pour partir ...
    Merci d'avance


    Côté Serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    public class ServiceAdapter extends Thread{
    	ServerSocket socket = null;
    	String service = null;  
    
    	public ServiceAdapter(){
    		try {		
    			// Create the ServerSocket on the port 4444
    			socket = new ServerSocket(4444);
    			System.out.println("Server started");
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	
    	public void run() { // Run the Server Thread
    		
    		Socket serviceSocket;
    		try {
    			
    			while(true) {
    				serviceSocket = socket.accept(); // The socket can accept incoming calls
    				
    				ObjectInputStream is = new ObjectInputStream(serviceSocket.getInputStream());
    				ObjectOutputStream os = new ObjectOutputStream (serviceSocket.getOutputStream());
    			
    				try {
    					service = is.readObject().toString();
    				} catch (ClassNotFoundException e) {
    					e.printStackTrace();
    				}
    				
    				if(service.equals("Yellow Pages")) // If the asked service is Yellow Pages 
    					new YellowPagesSkeleton(os,is).run(); // Launch the Skeleton
    				else if (service.equals("Phone Book")) //  If the asked service is Phone Book
    					new PhoneBookSkeleton(os,is).run(); // Launch the Skeleton
    				else
    					System.out.println("unknown Service : " + service);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}	
    	}
    }

    Côté client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    
    public class ClientAdapter{
    	
    	ObjectInputStream is =null;
    	ObjectOutputStream os = null;
    	public static Socket s=null;
    	public Object res;
      
    	public ClientAdapter(){	
    	}
    	
    
    	
    	public synchronized void invoke( String service, int addr,String method, String[] args){
    		
    		try {
    			// Create a Socket on the port 4444 with the address localhost
    			s = new Socket("localhost", 4444);
    			
    			// Create input and output Streams
    			os = new ObjectOutputStream(s.getOutputStream());			
    			is = new ObjectInputStream(s.getInputStream());
    			os.writeObject(service);
    			os.writeObject(addr);
    			os.writeObject(method);
    			
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    		if ( (addr==-1) && (method.equals("new") )){
    			try {
    				os.flush();
    				res = is.readObject();
    			} catch (IOException e) {
    				e.printStackTrace();
    			} catch (ClassNotFoundException e) {
    				e.printStackTrace();
    			}
    		}
    		
    		else {
    			try {				
    				for(int i=0; i<args.length; i++) {
    					os.writeObject(args[i]);
    				}				
    				os.flush();
    				res = is.readObject();
    			} catch (IOException e) {
    				e.printStackTrace();
    			} catch (ClassNotFoundException e) {
    				e.printStackTrace();
    			}
    		}
    		
    		try {
    			// Close the socket
    			s.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }

  2. #2
    Membre habitué
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    He bien ....
    -reprendre un programme de type Hello World qui fonctionne, et que tu comprends, avec un client et un serveur.
    - faire évoluer le contrat IDL pour satisfaire tes besoins. La fonction d'annuaire que tu veux implémenter semble basique et doit pouvoir se réaliser avec une seule interface et 2 méthodes (lire et écrire) avec les paramètres qui vont bien (paramètres simples, structures...);
    - et après tu te poseras la question de la necessité du multi thread côté serveur. Bon on le ferait au préalable dans un vrai design, mais si tu pars de zéro il faut que tu maîtrises la définition de ton contrat IDL et la mise en oeuvre d'un client et d'un serveur.

    Au passage tu ne raisonnes pas "manipulation de flux" entre client et serveur Corba, mais appel de méthodes distantes. Tu es dans un monde d'objets répartis, la tuyauterie des flux est masquée. Tu peux oublier tout le côté "socket" de ton programme existant, et même le côté "thread" au début, mais tu vas récupérer la structuration des données échangées pour les ré-exprimer en IDL.

    Pour obtenir de l'aide, le mieux est que tu fasses un premier jet de contrat IDL qui sera une bonne base pour discuter sur ce forum spécialisé en newbie Corba (ne prends pas mal cette légère pointe d'ironie ).

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Tout d'abord, merci pour ta réponse.

    J'ai essayé convertir les clients et serveurs pour qu'ils communiquent en Corba.
    Seulement, je ne vois pas comment remplacer mes flux (ObjectOutputStream et ObjectInputStream). Parce qu'on est bien d'accord que je ne peux plus les utiliser ?

    Un autre problème, c'est que lorsque je met dans mon IDL Object getData();
    il me prend le Object de Corba, alors que je voudrais que ce soit le Object de Java ....

    Voici mon fichier IDL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    module Annaire
    {
      interface Annu
      {
      void putData(in string str);
      Object getData();  
      oneway void shutdown();
      };
    };

  4. #4
    Membre habitué
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    On est bien d'accord les XXXStream de Java ne te sont d'aucune utilité. En même temps c'est une bonne nouvelle, non ?

    L'Object au sens Corba n'est pas un Object au sens Java. Ta méthode
    Object getData() exprime que tu renvoies un Object CORBA quelconque, sans préciser l'interface CORBA qu'il implémente.

    Tu ne peux pas véhiculer d'objet Java, le contrat IDL est limité aux éléments déclarées dans ton IDL. Pour faire passer des objets Java il faudrait utiliser RMI.

    Donc geData() te renverrait un autre objet CORBA sur lequel tu appelerais d'autres méthodes. Ce n'est pas forcémment ce que tu souhaites, mais plutôt renvoyer un paquet de données correspondant à une entrée de ton annuaire.

    Donc qque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        struct SomeData {
           string name;
           // some others attributes
         };
         interface Annu
        {
          SomeData getData(in string aName);  
        };
    Ce sont dans ces structures de type SomeData que tu dois redéfinir les données échangées dans tes Java Streams.
    Logiquement tu es obligé de passer par une rédéfinition en IDL des objets Java utilisés dans les Streams, sauf éventuellement à sérialiser ces objets en binaire et les passer en byte dans l'IDL, mais là l'intérêt de faire du CORBA devient nul.

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai créé l'interface IDL avec une structure qui semble me convenir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    module annuaire
    {
    
      struct SomeData {
           string service;
           long addr;
           string method;  
           
           string name;
      	   string address;
      	   string phoneNum; 
      	   
      	   string result;   
      };
      
    
      interface Hello
      {
    	  void call(in string service, in long addr, in string method);
    	  void seekData(in string str);
    	  SomeData getData();  
    	  oneway void shutdown();
      };
    Seulement, j'ai un problème, la partie serveur a l'air de se lancer sans problèmes, mais le client ne fonctionne pas. Il me sort une erreur de connection sur un numéro de port que je n'ai jamais configuré et (j'ai cherché) n'est jamais spécifié dans aucun de mes fichiers java.

    Erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    2 déc. 2007 21:49:49 com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl <init>
    ATTENTION: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: XXX.XXX.XXX.XXX; port: 2915"
    org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No
    	at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(Unknown Source)
    	at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(Unknown Source)
    	at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(Unknown Source)
    	at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(Unknown Source)
    	at com.sun.corba.se.impl.transport.SocketOrChannelContactInfoImpl.createConnection(Unknown Source)
    	at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(Unknown Source)
    	at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.request(Unknown Source)
    	at org.omg.CORBA.portable.ObjectImpl._request(Unknown Source)
    	at helloApp._HelloStub.call(_HelloStub.java:18)
    	at clientSide.ClientAdapter.invoke(ClientAdapter.java:88)
    	at clientSide.YellowPagesFactory.getOne(YellowPagesFactory.java:19)
    	at clientSide.Client.<init>(Client.java:17)
    	at clientSide.StartClient.main(StartClient.java:5)
    Caused by: java.net.ConnectException: Connection refused: connect
    	at sun.nio.ch.Net.connect(Native Method)
    	at sun.nio.ch.SocketChannelImpl.connect(Unknown Source)
    	at java.nio.channels.SocketChannel.open(Unknown Source)
    	at com.sun.corba.se.impl.transport.DefaultSocketFactoryImpl.createSocket(Unknown Source)
    	... 11 more

    Code du client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    public class ClientAdapter{
    
    	static Hello helloImpl;
    	ObjectInputStream is =null;
    	ObjectOutputStream os = null;
    	public java.lang.Object res;
    	
    	public ClientAdapter(){
    		
    	}
    	
        synchronized void invoke( String service, int addr, String method, String[] args){
    		 ////// Connection au serveur
    		 
    		 try{
    		      // create and initialize the ORB
    			String[] port = new String[6];
    			port[0] = "-ORBInitialPort";
    			port[1] = "15000";
    			port[2] = "-ORBInitialHost";
    			port[3] = "localhost";
    			port[4] = "-port";
    			port[5] = "1050";
    			
    			ORB orb2 = ORB.init(port, null);
    		
    		      // get the root naming context
    		      org.omg.CORBA.Object objRef = 
    			    orb2.resolve_initial_references("NameService");
    		      // Use NamingContextExt instead of NamingContext. This is 
    		      // part of the Interoperable naming Service.  
    		      NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
    		
    		      // resolve the Object Reference in Naming
    		      String name = "Hello";
    		      helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));
    		
    		      System.out.println("Obtained a handle on server object: " + helloImpl);
    		
    
    		      //helloImpl.shutdown();
    		
    			} catch (Exception e) {
    		        System.out.println("ERROR : " + e) ;
    			  e.printStackTrace(System.out);
    			  }
    		
    			
      		/// L'erreur se déclenche sur cet appel-ci
    			helloImpl.call(service,addr,method);
    
    
    			if ( (addr==-1) && (method.equals("new") )){
    				System.out.println("33");
    					res = helloImpl.getData();
    					System.out.println("44");
    			}
    			
    			else {
    						
    					for(int i=0; i<args.length; i++) {
    						helloImpl.seekData(args[i]); 
    					}				
    					res = helloImpl.getData();
    			}
    		}
    
    
    }
    et le code de mon serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    public class ServiceAdapter { //HelloServer
    
    		  public static void main(String args[]) {
    		    try{
    		      // create and initialize the ORB
    	    	  String[] stt = new String[4];
    			  stt[0] = "-ORBInitialPort";
    			  stt[1] = "15000";	
    			  stt[2] = "-ORBInitialHost";
    			  stt[3] = "localhost";
    		      ORB orb = ORB.init(stt, null);
    
    		      // get reference to rootpoa & activate the POAManager
    		      POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
    		      rootpoa.the_POAManager().activate();
    
    		      // create servant and register it with the ORB
    		      HelloImpl helloImpl = new HelloImpl();
    		      helloImpl.setORB(orb); 
    
    		      // get object reference from the servant
    		      org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
    		      Hello href = HelloHelper.narrow(ref);
    			  
    		      // get the root naming context
    		      // NameService invokes the name service
    		      org.omg.CORBA.Object objRef =
    		          orb.resolve_initial_references("NameService");
    		      // Use NamingContextExt which is part of the Interoperable
    		      // Naming Service (INS) specification.
    		      NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
    
    		      // bind the Object Reference in Naming
    		      String name = "Hello";
    		      NameComponent path[] = ncRef.to_name( name );
    		      ncRef.rebind(path, href);
    
    		      System.out.println("HelloServer ready and waiting ...");
    
    		      // wait for invocations from clients
    		      System.out.println("avant");
    		      orb.run();   
    		      System.out.println("apres");
    		    } 
    			
    		      catch (Exception e) {
    		        System.err.println("ERROR: " + e);
    		        e.printStackTrace(System.out);
    		      }
    		      System.out.println("HelloServer Exiting ...");
    			
    		  }
    	
    		  
    public void run() { //sayHello
    			  
    			 // String service ;
    
    
    					while(true) {	
    		
    
    				  
    						SomeData sdta = null;
    						sdta.addr = SomeData.addr;
    						sdta.method = SomeData.method;
    						sdta.service = SomeData.service;
    						
    						if(SomeData.service.equals("Yellow Pages")) // If the asked service is Yellow Pages 
    							new YellowPagesSkeleton(sdta).run(); // Launch the Skeleton
    						else if (SomeData.service.equals("Phone Book")) //  If the asked service is Phone Book
    							System.out.println("cc");
    							//new PhoneBookSkeleton(sdta).run(); // Launch the Skeleton
    						else
    							System.out.println("unknown Service : " + sdta.service);
    		}
    
    
    		  }
    		  
    }

  6. #6
    Membre habitué
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    mmmh étrange.
    Mais Google nous dit qu'il y a des bugs pas clairs chez Sun pour les JDK > 1.4.2 avec ce genre d'exception COMM_FAILURE + com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure

    Tu peux :
    -> passer sur Jacorb, qui fonctionne.
    -> tenter des alternatives : exemple passer l'IOR par un fichier plutôt que par le NamingService, pour voir si c'est pas lié à ça.
    -> essayer avec un JDK 1.4.2 (les bugs parlent du 1.5/1.6).

    Sinon vite fait là je ne vois pas.

    Sinon pour contrôler que ton serveur tourne bien sur le port que tu as affecté:
    netstat -a pour la liste des ports utilisés
    netstat -a | grep numero_de_port si tu es sous linux ou cygwin.

    si le port que tu as donné est utilisé et que tu ne t'es pas fait jeté au démarrage du serveur, alors c'est bon. Sinon le serveur a ignoré l'option -ORBInitialPort pour une raison mystérieuse, et a utilisé un port au hasard, celui qui se retrouve dans les traces.

  7. #7
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 219
    Points : 302
    Points
    302
    Par défaut
    Une chose étrange, est que l'exception indique que la connection échoue sur le port 2915. Or il semble que tu essaies de lancer le serveur sur le port 15000...

    De plus, puisque tu passes par un NamingService, peu importe le port du serveur, car il est inclus dans l'IOR enregistré dans le NamingService.
    Le resolve_str du client a bien trouvé une référence sous le nom "Hello" et elle est du bon type (narrow OK).

    Le client, le serveur et le NamingService tournent-ils sur la même machine ?
    Si oui, il ne faut pas mettre le même port au serveur et au client.
    Si non, il vaut mieux mettre le nom réel des machines à -ORBInitialHost plutôt que localhost.

    Si ça ne marche toujours pas, ajoute le code suivant juste avant l'appel qui plante et envoie les traces:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.out.println("IOR du serveur:\n" + orb2.object_to_string(helloImpl));

Discussions similaires

  1. Problème threads java
    Par idjou dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 08/06/2007, 15h48
  2. [Thread] [java.lang.IllegalThreadStateException] [Start]
    Par moris113 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 29/05/2007, 15h44
  3. [JNI] Problème dû aux threads Java
    Par seiryujay dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/11/2006, 13h14
  4. thread java pour impression
    Par ericT dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 11/07/2006, 15h09
  5. [PROFILER][THREAD][java.prof] outil gratuit/complet?
    Par narmataru dans le forum Général Java
    Réponses: 11
    Dernier message: 16/11/2005, 12h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo