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

API standards et tierces Java Discussion :

Connexion AS400


Sujet :

API standards et tierces Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut Connexion AS400
    Bonjour,

    Je vous explique ma situation un peu particulière.
    Je cherche à modifier un plugin pour Nagios (supervision du réseau) qui permet de se connecter à un AS400 grâce à un login et un mot de passe.
    Le plugin utilise la classe .net et la fonction socket().

    ioSocket=new Socket(hostname,23);
    C'est donc une connexion telnet classique.

    Cependant, l'AS400 permet de se connecter avec un "device_name". Ce paramètre (qui est le nom de la machine cliente) ne peut pas être envoyé avec la fonction socket().

    J'ai donc fouillé dans les classes proprio d'IBM et les sources de l'applet Java TN5250J. Cet applet permet de se connecter à un AS400 (login + pass) en incluant un device_name. Mais voilà, n'étant pas très fort en Java (mes notes ne dépassaient pas les 5/20 héhé), je ne sais pas du tout comment faire pour remplacer le socket(hostname,port) par une classe incluant (hostname,port,device_name). Je me demandais si quelqu'un n'avait pas déjà penché son cerveau et ses neurones sur ce petit problème très particulier !

    Tout ceci n'est pas très clair, cependant si quelqu'un a une moindre idée de ce que je raconte, je peux poster d'autres infos

    A bientot j'espère !

  2. #2
    Membre habitué Avatar de Oui-Oui MB
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 127
    Points
    127
    Par défaut
    Il faudrait voir comment il faut dire à l'AS400 de prendre en compte le device_name. Est-ce un message envoyé sur le réseau genre le 1e message ou alors un truc du style DEVICE_NAME=... ?

    Si on sait comment l'applet fait, alors ca sera assez facile de le refaire en java. Il suffira de faire une classe avec une methode connect qui prend les 3 arguments. Cette méthode fera d'abord le connect d'IBM (avec login + pass) puis fera les traitements pour le device_name.
    Que la Schtuche soit avec vous !!!

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Je vois que tu es motivé pour m'aider

    Je t'envoie quelques informations que je juge utile :

    Lors de la connexion, voici ce qu'affiche le debug :

    16 [Thread-2] INFO org.tn5250j.framework.Tn5250jController - Tn5250j plugin manager started

    12125 [main] INFO org.tn5250j.framework.tn5250.tnvt - new session -> AS400

    12391 [Thread-3] INFO org.tn5250j.framework.transport.SocketConnector - Creating Plain Socket

    1 INFO018W2K

    Voici le contenu de org.tn5250j.framework.Tn5250jController :

    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
    		// check if device name is specified
    		if (isSpecified("-dn=hostname", args)) {
    			String dnParam;
     
    			// use IP address as device name
    			try {
    				dnParam = InetAddress.getLocalHost().getHostName();
    			} catch (UnknownHostException uhe) {
    				dnParam = "UNKNOWN_HOST";
    			}
     
    			sesProps.put(SESSION_DEVICE_NAME, dnParam);
    		} else if (isSpecified("-dn", args)) {
     
    			sesProps.put(SESSION_DEVICE_NAME, getParm("-dn", args));
    		}

    La partie startSession :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	public Screen5250 startSession(String name) {
    		JFrame frame = new JFrame();
    		String args[] = new String[15];
    		parseArgs((String) sesprops.get(name), args);
    		Properties fin = convertToProps(args);
    		Session5250 newses = manager.openSession(fin, null, name);
          SessionGUI newGui = new SessionGUI(newses);
    		frame.getContentPane().add(newGui);
    		frame.setBounds(50, 50, 960, 700);
    		frame.setVisible(true);
    		newses.connect();
    		return newses.getScreen();
    	}

    Voici le contenu de org.tn5250j.framework.tn5250.tnvt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		if (devName != null) {
    			baosp.write(USERVAR);
     
    			baosp.write("DEVNAME".getBytes());
     
    			baosp.write(VALUE);
     
    			baosp.write(negDeviceName().getBytes());
    		}
    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
    	private String negDeviceName() {
     
    		if (devSeq++ == -1) {
    			devNameUsed = devName;
    			return devName;
    		} else {
    			StringBuffer sb = new StringBuffer(devName + devSeq);
    			int ei = 1;
    			while (sb.length() > 10) {
     
    				sb.setLength(0);
    				sb.append(devName.substring(0, devName.length() - ei++));
    				sb.append(devSeq);
     
    			}
    			devNameUsed = sb.toString();
    			return devNameUsed;
    		}
    	}

    Et enfin le contenu de org.tn5250j.framework.transport.SocketConnector :

    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
      public Socket createSocket(String destination, int port) {
     
      	Socket socket = null;
      	Exception ex = null;
     
          if (sslType == null || sslType.trim().length() == 0 || 
          		sslType.toUpperCase().equals(TN5250jConstants.SSL_TYPE_NONE)) {
            	logger.info("Creating Plain Socket");
            try {
    			// Use Socket Constructor!!! SocketFactory for jdk 1.4
    			socket = new Socket(destination,port);
    		} catch (Exception e) {
    			ex = e;
    		}
          }
    Désolé de donner ça comme ça, brut de décoffrage, mais je crois avoir coupé les bons morceaux du code. Ce que je trouve 'bizarre' c'est le new Socket(host,port) qui est le même que l'autre code que je veux remplacer. Mais où est transféré le device_name ? (et les autres paramètres).

    J'ai collé tous les fichiers source sur mon site perso, si ça peut aider : http://clancdfr.free.fr/tn5250/

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Personne pour m'aider ?

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    J'vais essayer mais avant toute chose il est surement possible de se connecter en utilisant les sockets.
    Les sockets font partie de l'une des couches les plus basses que tu peux programmer avec Java pour les connexions réseaux et normalement elle doivent pouvoir s'appliquer dans toutes les sortes de connexions (SMTP, POP, TELNET, etc...). La librairie que tu devrait utiliser, si je ne m'abuse, simplifierait les connexions à un AS400.
    Maintenant je pense que pour mieux comprendre ce que tu feras il te faudrait connaitre le protocole de connexion à un AS400. Et surtout quand est-ce que ce device_name rentre en ligne de compte dans ta connexion...
    Lorsque tu aura découvert cela tu pourras réécrire une fonction qui utilise la classe "socket" pour se connecter au serveur.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Je me suis justement intéressé au rfc2877 qui spécifie les chaînes hexa à envoyer au serveur telnet juste après sa connexion. Par exemple :

    Légende :

    TEXT --> = envoyé par l'AS400 vers le client
    <-- TEXT = envoyé par le client vers l'AS400
    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
     
    IAC DO NEW-ENVIRON
    IAC DO TERMINAL-TYPE -->
     
    <-- IAC WILL NEW-ENVIRON
     
    IAC SB NEW-ENVIRON SEND
    VAR IAC SE -->
     
    IAC SB NEW-ENVIRON IS
    VAR "USER" VALUE "JONES"
    USERVAR "DEVNAME"
    VALUE "MYDEVICE07"
    IAC SE
    <-- IAC WILL TERMINAL-TYPE
     
    IAC SB TERMINAL-TYPE SEND
    IAC SE -->
    Plus clairement, chaque séquence est traduite en hexa et envoyée par l'AS400 vers le client et inversement.

    Il 'suffirait' alors, dans l'ordre :
    - se connecter par un simple socket,
    - écouter la première réponse de l'AS400
    - envoyer la première séquence vers l'as400 (new environment)
    - écouter la réponse de l'AS400
    - envoyer la séquence de connexion (incluant le LOGIN, le PASS et le DEVICE_NAME)
    - écouter la réponse de l'AS400
    - terminer en envoyant le EOR (end of record)
    - puis, laisser le plugin envoyer les commandes qu'il exploite (comme l'utilisation du disque dur... qui sont des commandes AS400 simples)

    J'ai donc analysé profondément le code du TN5250J, plus particulièrement la partie qui 'négocie' avec le serveur mais il est pour moi très difficile de l'adapter au code du plugin que je veux mettre à jour...

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 2
    Points
    2

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    Et si tu le fais dans telnet tu y arrives ? (je parle de la sequence d'authentification et de fermeture de session)

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Ben le problème c'est que quand je lance un telnet, ça arrive directement sur l'écran d'authentification de l'AS400. Impossible d'envoyer des données supplémentaires

  10. #10
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    Dans tout les cas si la séquence est juste tu peux la reproduire en envoyant le flux de données sur le Socket ouvert.
    En conbinant juste les envoies et les réceptions tu devrais t'en sortir...

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Quelle est la méthode à utiliser pour lire ce que le serveur m'envoie ?

  12. #12
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    Dès qu'un Socket est ouvert entre deux poste (client-serveur) tu peux en tout temps lire ce qu'il t'envoie et envoyer ce que tu veux.
    Maintenant pour la technique il y a des tutoriaux qui explique comment lire un flux de données sur un socket ouvert.

    Fais attention car comme j'ai pu le voir c'est le serveur qui commence les négociation (donc le client doit faire un read avant d'envoyé qqch)

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Ok je vais me renseigner alors Merci pour ton aide précieuse !

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Je n'arrive malheureusement pas à lire les données dans le format hexadécimal

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 56
    Points : 73
    Points
    73
    Par défaut
    Bonsoir.

    Je ne sais pas si vous connaissez ce site, mais pour ce qui est de trouver des
    infos pour l'as400, je n'ai pas encore trouvé mieux... normal, c'est le site officiel.

    En cherchant un peu (*) , j'ai trouvé 2 choses pour programmer en java avec l'as400 :
    - IBM Developer Kit for Java qui permet de développer sur le serveur
    - IBM ToolBox for Java qui permet de développer sur un poste client en relation avec un as400 ( comme serveur, ... évidemment ;-) )

    Je n'ai pas encore eu le temps de mettre tout ceci en oeuvre, alors ne m'en demandez pas plus, mais j'espère pouvoir le faire dès que j'aurais un moment de libre.

    Cela dit, j'espère que ces infos vous permettront d'avancer.

    Cordialement
    M.


    (*) après avoir choisi la version et la langue, dans le menu ( à gauche ) : programmation\java

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    Bonjour

    Je m'étais déjà intéressé à jtopen et au dkit as400. Malheureusement je n'ai pas trouvé les informations nécessaires à l'exploitation des informations envoyées au telnet (et la communication entre client et serveur) permettant de spécifier un dev_name. En effet, les classes java proposées par IBM permettent au mieux de se connecter simplement (hostname, port, login, pass). Le reste sert à exploiter des programmes, oledb et tout plein d'autre truc dont je n'ai pas la moindre idée de leur utilité Cependant, la solution théorique se trouve dans le rfc2877 et la solution pratique dans les sources de TN5250J (où ils arrivent parfaitement à communiquer avec le telnet !).

  17. #17
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    Salut,
    malheureusement nous ne pouvons te donner que des réponses théorique à ton problème. Cela du à notre incapacité de faire des tests pratiques (personnellement j'ai pas d'AS400. Mais je vais demander à qqun que je connais s'il peut aller jeter un oeil à ce post...
    A+

  18. #18
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    Pour commencer, contrôle si ton utilisateur existe bien dans l'as400.
    Ensuite si tu peux essayer d'afficher ce que te retourne l'as400 et ce que tu lui envoie jusqu'à ce que ca ne marche plus ca serait super...

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 16
    Points : 2
    Points
    2
    Par défaut
    En fait, j'arrive très bien a me connecter au telnet de l'as/400, lui spécifier l'utilisateur et le mot de passe sans probleme. En fait, ce qu'il faut c'est lui envoyer un parametre en hexa juste après la négociation du telnet. (cf rfc2877). Mais je n'arrive ni a lire les négociations niveau serveur ni lui envoyer mes négocs coté client...

  20. #20
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    Essai de mettre sur ce post la sortie de ta console STP...

Discussions similaires

  1. [WD 15] Autoriser connexions AS400
    Par jul52 dans le forum WebDev
    Réponses: 0
    Dernier message: 24/05/2011, 10h34
  2. connexion AS400 pour Talend
    Par Elise02 dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 03/03/2009, 13h02
  3. Connexion AS400 : No suitable Driver
    Par chico_du_33 dans le forum JDBC
    Réponses: 2
    Dernier message: 14/08/2007, 17h12

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