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

Eclipse Java Discussion :

Difficultés à créer un exécutable


Sujet :

Eclipse Java

  1. #21
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par StripMat Voir le message
    A d'accord, sa fait écho à mon utilisation (abusive) du type String, je vais changer ça. Merci du conseil.
    Ce n'est pas le type String en lui-même qui est problématique, c'est le fait de charger en mémoire un flux de plusieurs mégaoctets pour le carrer dans une String, donc forcément en plusieurs fois (donc créations/copies de tableau multiples), tout ça pour le traiter quand même comme un flux. La phase suivante c'est éventuellement d'intercaler un BufferedInputStream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try(InputStream inputStream = new BufferedInputStream(httpResponse.getEntity().getContent()/*, éventuellement ajuster la taille, mais la valeur par défaut devrait aller*/) {

    Ah, puis, au fait, j'ai oublié dans mon exemple l'encodage : createXMLStreamReader(inputStream, "UTF-8").
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  2. #22
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Ah d'accord ouais je comprend mieux, effectivement expliqué comme ça c'est pas malin de se servir de String. Surtout quand mon programme (le processus Java.exe) monte quand même à plus d'1Go de mémoire vive, c'est quand même pas mal pour ce que je veux faire. Mon code est clairement pas optimisé


    J'essaye de faire tourner Wireshark, mais ne l'ayant jamais utilisé faut que je comprenne comment le paramétrer et comment l'utiliser


    EDIT : Je connaissais pas BufferedInputStream (en fait je maitrises pas du tout les stream en général). Ca accélère encore le temps de lecture, cool ça.
    Code Java : 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
     
    //Sans BufferedInputStream
    InputStream entree = new FileInputStream("x");
    for( int c = entree.read(); c !=-1; c = entree.read()) ... ;
    entree.close();
     
    //Avec
    InputStream entree = new BufferedInputStream(
       new FileInputStream("x"), 4096);
       for( int c = entree.read(); c !=-1; c = entree.read()) ... ;
       entree.close();
     
     
    Les temps d'exécution, sur un même fichier, sont  :
    • 3s pour la séquence sans BufferedInputStream 
    • 0, 23s pour la séquence avec BufferedInputStream.

  3. #23
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par StripMat Voir le message
    J'essaye de faire tourner Wireshark, mais ne l'ayant jamais utilisé faut que je comprenne comment le paramétrer et comment l'utiliser
    Quelque chose qui peut peut-être t'aider : http://inetdoc.developpez.com/tutori...eau-wireshark/


    Citation Envoyé par StripMat Voir le message
    EDIT : Je connaissais pas BufferedInputStream (en fait je maitrises pas du tout les stream en général). Ca accélère encore le temps de lecture, cool ça.
    Un BufferedInputStream (ou BufferedReader, ou BufferedOutputStream/BufferedWriter en écriture) au lieu de lire octet par octet utilise un tampon (=buffer), un tableau d'octets, pour lire par groupe d'octets, ce qui fait gagner un peu de temps (on peut ajuster la taille du buffer, mais en général un buffer de 2 kibis apporte déjà un gain appréciable (inutile de faire de trop gros buffer, il faut bien les parcourir à un moment donné pour les copier). Ce gain est dû à ce qui doit être mis en œuvre avec les couches internes de l'I/O à chaque lecture ou écriture (et donc dépend de du type d'I/O): si on réduit le nombre d'interaction, on réduit l'impact du temps consommé par l'interaction avec la couche interne.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #24
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    J'ai du relire deux fois pour comprendre mais merci pour l'explication concernant les BufferedStream, c'est pour ce genre de petits trucs que j'adore ce forum et ces membres, car c'est bien de se débrouiller tout seul et de chercher mais il arrive toujours un moment ou je ne sais plus quoi chercher .

    Je vais suivre ton lien concernant WireShark, j'arrive déjà à capturer mes paquets mais pour l'instant je ne sais pas identifier ceux qui concernent mes interactions avec mon serveur BO

  5. #25
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Quelles informations souhaitais tu observer avec Wireshark ?

    J'ai fais un focus sur la requête Http me permettant de récupérer le token de session.

    Le principe :
    1. J'envois une requête Http GET vers l'URL /biprws/logon/long afin que le webservice m'envois la structure du XML à envoyer pour récupérer le token de session.
    2. Le webservice me renvoit un XML.
    3. Je complete le XML avec mes informations de connexion.
    4. J'envois une requête Http POST vers l'URL /biprws/logon/long contenant le XML valorisé avec mes identifiants/passwords
    5. Le webservice me renvoit un XML contenant le token de session

    Vu ton niveau c'est peut-être pas utile de préciser tout ça mais bon

    Comme tu semble bien connaitre Wireshark, saurais-tu m'indiquer quels éléments du paquets je dois extraire et comparer ? J'ose pas poster tout le contenu de mes paquets, ne comprenant pas tout, je ne sais pas s'il contient des infos sensibles.
    Je vois bien des trucs comme Arrival Time, Epoch Time, Time Shift,...

  6. #26
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Ah, je crois avoir trouvé d'ou viennent ces 8/10s pour récupérer mon token de session

    Envois du premier GET :
    Arrival Time : Mar 14, 2017 17:48:05.684914000 Paris, Madrid

    Reception du POST contenant le token :
    Arrival Time : Mar 14, 2017 17:48:15.155630000 Paris, Madrid

    15 - 05 ça fait bien 10 ?

    Je vais tester sous Eclipse maintenant !

    EDIT : Mêmes choses lorsque j'exécute sous Eclipse

    Envois du premier GET :
    Mar 14, 2017 17:55:19.544700000 Paris, Madrid
    Reception du POST contenant le token :
    Mar 14, 2017 17:55:19.974335000 Paris, Madrid

    A peine une demie seconde...

    EDIT2: J'me suis un peu emballé hier. Certes entre le premier GET et la réception du dernier POST il y a presque 10 secondes, mais c'est le traitement entre les deux requêtes qui se traîne (étapes 2, 3, 4 voir plus haut).
    Voilà le code de ma classe SessionToken, le XML est traité avec une api DOM (petit XML donc j'ai pas modifié pour un traitement en StAX). Si j'ai une configuration différente hors Eclipse, sa pourrait venir de là ?
    Code Java : 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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
     
    package BusinessObjectConnector;
     
    import java.io.BufferedInputStream;
    import java.io.InputStream;
    import java.io.StringReader;
    import java.io.StringWriter;
     
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
     
    import org.apache.http.Header;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpHost;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.InputSource;
     
    public class SessionToken {
    	static HttpHost _target;
     
    public static String get(HttpHost theTarget, String sUserName, String sPassword, String sAuth) {
    		String sServer = "uneipdeserveur";
    		String sPort = "6405";
    		String sLogonToken = "";
    		// creation of an http host
    		// specify the host, protocol, and port
    		_target = new HttpHost(sServer, Integer.parseInt(sPort), "http");
    		try {
    			sLogonToken = logonCMS(sUserName, sPassword, sAuth);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return sLogonToken;
    	}
     
    	public static Document loadXMLFromString(String xml) throws Exception {
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder builder = factory.newDocumentBuilder();
    		InputSource is = new InputSource(new StringReader(xml));
    		return builder.parse(is);
    	}
     
    	public static void logoffCMS(String sLogonToken) throws Exception {
    		final CloseableHttpClient httpClient = HttpClientBuilder.create().build();
    		boolean loggedOff = false;
    		// Post preparation
    		//
    		try {
    			HttpPost httpPostRequest = new HttpPost("/biprws/logoff");
    			httpPostRequest.addHeader("Accept", "application/xml");
    			httpPostRequest.addHeader("X-SAP-LogonToken", sLogonToken);
    			StringEntity myEntity = new StringEntity("");
    			myEntity.setContentType("application/xml");
    			httpPostRequest.setEntity(myEntity);
    			HttpResponse httpResponse = httpClient.execute(_target, httpPostRequest);
    		} catch (Exception e) {
    			loggedOff = true;
    		} finally {
    			// When HttpClient instance is no longer needed,
    			// shut down the connection manager to ensure
    			// immediate deallocation of all system resources
    			if (loggedOff) {
    				System.out.println("Business Object : Logged off.");
    			}
    			httpClient.close();
    		}
    	}
     
    	public static String logonCMS(String sUserName, String sPassword, String sAuth) throws Exception {
    		final CloseableHttpClient httpClient = HttpClientBuilder.create().build();
    		try {
    			Document xmlResponse = null;
    			//
    			// send get and retrieve entity
    			//
    			HttpGet httpGetRequest = new HttpGet("/biprws/logon/long");
    			System.out.println("executing request to " + _target);
    			HttpResponse httpResponse = httpClient.execute(_target, httpGetRequest);
    			HttpEntity entity = httpResponse.getEntity();
    			// If the response does not enclose an entity, there is no need
    			// to bother about connection release
    			String sFinal = "";
    			if (entity != null) {
    				InputStream inputStream = entity.getContent();
    				sFinal = recupereStringInputStream(inputStream);
    				//
    				// modify the xml for the post
    				//
    				try {
    					xmlResponse = loadXMLFromString(sFinal);
    					renseigneNode(xmlResponse, "userName", sUserName);
    					renseigneNode(xmlResponse, "password", sPassword);
    					renseigneNode(xmlResponse, "auth", sAuth);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    				//
    				// post preparation
    				//
    				HttpPost httpPostRequest = new HttpPost("/biprws/logon/long");
    				//
    				// transforms xml in String
    				//
    				TransformerFactory tf = TransformerFactory.newInstance();
    				Transformer transformer = tf.newTransformer();
    				transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    				StringWriter writer = new StringWriter();
    				transformer.transform(new DOMSource(xmlResponse), new StreamResult(writer));
    				String s = writer.getBuffer().toString().replaceAll("\n|\r", "");
    				//
    				// put the xml inentity
    				//
    				StringEntity myEntity = new StringEntity(s);
    				//
    				// send post
    				//
    				myEntity.setContentType("application/xml");
    				httpPostRequest.setEntity(myEntity);
    				httpResponse = httpClient.execute(_target, httpPostRequest);
    				Header hLogonToken = httpResponse.getFirstHeader("X-SAP-LogonToken");
    				String sReturn = hLogonToken.getValue();
    				return sReturn;
    			}
    		} catch (Exception e) {
    			// thrown by entity.getContent();
    			e.printStackTrace();
    		} finally {
    			// When HttpClient instance is no longer needed,
    			// shut down the connection manager to ensure
    			// immediate deallocation of all system resources
    			httpClient.close();
    			;
    		}
    		return "";
    	}
     
    	public static String recupereStringInputStream(InputStream inputStream) throws Exception {
    		byte[] buffer = new byte[1024];
    		String sFinal = "";
    		int bytesRead = 0;
    		BufferedInputStream bis = new BufferedInputStream(inputStream);
    		while ((bytesRead = bis.read(buffer)) != -1) {
    			sFinal = sFinal + new String(buffer, 0, bytesRead);
    		}
    		return sFinal;
    	}
     
    	public static Document renseigneNode(Document myXmlDoc, String sItemName, String sTextContent) {
    		NodeList nl = myXmlDoc.getElementsByTagName("attr");
    		for (int i = 0; i < nl.getLength(); i++) {
    			Node no = nl.item(i);
    			if (sItemName.equals(no.getAttributes().getNamedItem("name").getNodeValue())) {
    				no.setTextContent(sTextContent);
    			}
    		}
    		return myXmlDoc;	
    	}
    }

    Dans mon main j'appelle SessionToken.get(_target, sUserName, sPassword, sAuth);

Discussions similaires

  1. java créer un exécutable
    Par damned3 dans le forum EDI et Outils pour Java
    Réponses: 4
    Dernier message: 02/09/2006, 04h58
  2. [VB 2005 Express] Comment créer un exécutable ?
    Par taly dans le forum Visual Studio
    Réponses: 3
    Dernier message: 26/06/2006, 12h30
  3. Créer un exécutable
    Par hitchie dans le forum MFC
    Réponses: 4
    Dernier message: 10/04/2006, 11h05
  4. [RegEx] difficulté à créer un motif de recherche
    Par cyberzoide dans le forum Langage
    Réponses: 3
    Dernier message: 16/11/2005, 19h46
  5. [Debutant(e)]créer un exécutable
    Par seringua1 dans le forum EDI et Outils pour Java
    Réponses: 3
    Dernier message: 08/06/2004, 13h34

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