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

Java ME Discussion :

Connexion HTTP


Sujet :

Java ME

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut Connexion HTTP
    Bonjour tout le monde,
    Merci de votre aide sur ce bout de code :

    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
     
     
    /**
     * Connection HTTP par la méthode GET
     * 
     * @param u
     * @param p
     * */
    	void seConnecter(String u, String p) throws IOException {
    		/**Pour se connecter au serveur HTTP*/
    		HttpConnection c = null;
     
    		/**Réponse du serveur HTTP sous forme de flux*/
            InputStream is = null;
     
            try {
            	c = (HttpConnection)Connector.open(url+"/connect/"+u+"/"+p);
            	c.setRequestMethod(HttpConnection.GET);
     
     
            	is = c.openInputStream();
            	/**
                     * Quelque part par la j'ai le msg d'erreur : 
                     * java.io.IOException: no more input streams available ou 
                     * java.lang.NullPointerException
                     * 
                     * */
     
            	responseHttp(c,is);
     
     
     
            } finally {
                if (is != null) {
                    is.close();
                }
     
                if (c != null) {
                    c.close();
                }
            }
     
    	}
    En faite je dois concevoir un client HTTP pour qui s'authentifie auprès d'un serveur avec un nom d'utilisateur et un mot de passe.
    La connection HTTP se passe bien. Mais lorsque je récupére le flux d'entrée (openInputStream) j'ai un msg d'erreur dans le genre "java.io.IOException ou "java.lang.NullPointerException". Je comprend bien que cela dit que j'ai aucune réponse dans l'entrée flux. Merci d'avance.

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 795
    Points : 1 270
    Points
    1 270
    Par défaut
    Salut syneta,

    comment sais-tu que la connection s'est bien passée ?
    Est-ce que tu vois la communication passer avec un sniffer de packets réseau genre Wireshark ?
    Si oui, est-ce que des paquets sont bien envoyés de ton serveur vers le client ?

    Dans mes souvenirs, il fallait faire un openOutputStream() avec l'object HttpConnection puis un .flush() pour faire partir la requête.
    Est-tu sûr de pouvoir directement faire un OpenInputStream() ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Salut Aniki,
    Loin de mon reconnaître comme expert en J2ME, je pensais qu'un flush n'étais pas obligatoire pour la méthode GET. En tout cas je prend en considération. Et Merci pour la réponse.
    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
     
    void login(String u, String p) throws IOException {
    		formConnected = new Form ("Connection...");
    		msgServeur = new StringItem("", "");
    		display = Display.getDisplay(this);
    		formConnected.append(msgServeur);
    		formConnected.addCommand(cmdListe);
    		formConnected.addCommand(cmdModifier);
    		formConnected.addCommand(cmdDeconnect);
    		//formConnected.addCommand(cmdQuitter);
    		display.setCurrent(formConnected);
     
    		/**Pour se connecter au serveur HTTP*/
    		HttpConnection c = null;
     
    		/**Réponse du serveur HTTP sous forme de flux*/
            InputStream is = null;
     
     
    	        try {
    	        	c = (HttpConnection)Connector.open(url+"/connect/"+u+"/"+p);
    	        	c.setRequestMethod(HttpConnection.GET);
     
    	        	DataInputStream dis = new DataInputStream (c.openInputStream());
     
    	        	/**Récupération byte par byte de la réponse du serveur*/
    	        	int ch;
     
    	        	while ((ch = dis.read()) != -1) {
    	        		buffer.append((char)ch);
    	        	}
     
    	        	/***
                             * 
                             * Un simple println sur l'ecan j'arrive à récupérer en String la réponse du serveur.
                             * */
    	        	//System.out.println("message du serveur  : " + buffer.toString());
     
     
    	        } catch( Exception e )
    	        {
    	            e.printStackTrace();
    	            buffer.append( "ERROR CONNECTION HTTP" );
    	        } 
     
    	/**Free i/o Stream et Connection HTTP*/     
    	        finally {
    	            if (is != null) {
    	                is.close();
    	            }
     
    	            if (c != null) {
    	                c.close();
    	            }
    	        }
     
    	        msgServeur.setText(buffer.toString());
     
    		}
    Je récupére bien la réponse du serveur et initialise un traitement sur la réponse. Mais j'ai un message de "Warning: To avoid potential deadlock, operations that may block, such as
    networking, should be performed in a different thread than the
    commandAction() handler."

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 795
    Points : 1 270
    Points
    1 270
    Par défaut
    En fait, ça fait un moment que je n'ai plus fait de J2ME. Je parle de mémoire et peux me tromper...
    Effectivement, le flush() n'était pas forcément obligatoire mais recommandé. Si tu ne fais pas de flush(), la requête partira quand tu feras le .close(), si je me rappelle bien.

    Le warning est là pour te prévenir que si le traitement de la requête devait prendre du temps, ton application sera bloquée pendant tout ce temps.
    Pour remedier à cela, il faut effectuer tout ce traitement dans un thread séparé.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Merci Aniki, it works well !
    Mais je reste bloquer sur mon écran d'accueil. l'idée est que si l'authentification est 'ok' j'affiche le formulaire avec les commandes Etat périphériques, Modifier, Déconnecter (Capture 1) sinon je retourne à mon accueil et je notifier 'erreur d'authentification' (capture 2). Est ce que cela serait pas les thread qui me bloquent?

    Voici mon code :

    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
    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
    172
    173
    174
    175
    176
    177
    178
    179
    180
     
    public class DomoBox extends MIDlet implements CommandListener, Runnable {
     
    	/**URL HTTP du serveur domobox*/
    	private String url ="http://daviddurand.info/D228/domo";
     
        private Display display;
     
        private Form form;
     
       // private TextField login, password;
     
    	StringBuffer buffer = new StringBuffer();
     
    	/**Commande pour quitter l'application*/
    	private Command cmdQuitter = new Command("Quitter", Command.CANCEL, 2);
     
    	/**Commande pour se connecter*/
    	private Command cmdConnect = new Command("Se Connecter", Command.OK, 2);
     
    	/**Commande pour afficher l'état des périphériques*/
        private Command cmdEtat = new Command("Etat Périphériques", Command.ITEM, 1);
     
        /**Commande pour modifier/mettre à jour un appareil*/
        private Command cmdModifier = new Command("Modifier", Command.ITEM, 1);
     
        /**Commande pour se déconnecter de la domobox*/
        private Command cmdDeconnect = new Command("Se déconnecter", Command.ITEM, 1);
     
        /**Champ Nom d'utilisateur*/
        TextField login = new TextField("Nom d'utilisateur :", "", 20, TextField.ANY);
     
        /**Champ Mot de passe*/
        TextField password = new TextField("Mot de passe :", "", 20, TextField.PASSWORD);
     
    	boolean firstime = true;
     
    	private Command currentCommand;
     
    	private Thread commandThread;
     
    	public void startApp() throws MIDletStateChangeException {
     
        		mainscreen ("");
        }
     
        /**Accueil*/
        private void mainscreen(String msg) {
    		form = new Form ("Connexion au DOMOBOX");
    		StringItem notifier = new StringItem ("",msg);
            form.append(login);
            form.append(password);
            form.append(notifier);
            display = Display.getDisplay(this);
     
            setCommands (form,true);
     
            display.setCurrent(form);
     
    	}
     
        void setCommands(Displayable d, boolean islist) {
            if (islist) {
                d.addCommand(cmdQuitter);
                d.addCommand(cmdConnect);
            } else {
                d.addCommand(cmdEtat);
                d.addCommand(cmdModifier);
                d.addCommand(cmdDeconnect);
            }
     
            d.setCommandListener(this);
        }
     
     
    	public void pauseApp() {
        }
     
        public void destroyApp(boolean unconditional) {
        }
     
     
        /****
         * THREAD
         */
            public void commandAction(Command c, Displayable d) {
                synchronized (this) {
                    if (commandThread != null) {
                        // process only one command at a time
                        return;
                    }
     
                    currentCommand = c;
                    commandThread = new Thread(this);
                    commandThread.start();
                }
     
     
            }
     
     
    	public void run() {
    		if (currentCommand == cmdQuitter) {
    			destroyApp(false);
                notifyDestroyed();
    		} else if (currentCommand == cmdConnect) {
    			seConnecter(login.getString(),password.getString());
    		}
            synchronized (this) {
                // signal that another command can be processed
                commandThread = null;
            }
    	}
     
    	private void seConnecter(String u, String p)  {
    		/**Pour se connecter au serveur HTTP*/
    		HttpConnection c = null;
     
    		/**Réponse du serveur HTTP sous forme de flux*/
            InputStream is = null;
     
    	        try {
    	        	c = (HttpConnection)Connector.open(url+"/connect/"+u+"/"+p);
    	        	c.setRequestMethod(HttpConnection.GET);
     
    	        	DataInputStream dis = new DataInputStream (c.openInputStream());
     
    	        	/**Récupération byte par byte de la réponse du serveur*/
    	        	int ch;
     
    	        	while ((ch = dis.read()) != -1) {
    	        		buffer.append((char)ch);
    	        	}
     
     
    	        } catch( Exception e )
    	        {
    	            e.printStackTrace();
    	            buffer.append( "ERROR CONNECTION HTTP" );
    	        }
     
    	/**Free i/o Stream et Connection HTTP*/     
    	        finally {
    	            if (is != null) {
    	                try {
    						is.close();
    					} catch (IOException e) {
     
    						e.printStackTrace();
    					}
    	            }
     
    	            if (c != null) {
    	                try {
    						c.close();
    					} catch (IOException e) {
     
    						e.printStackTrace();
    					}
    	            }
     
    	        }
     
    /**
     * Je doute que c'est à partir d'ici que les choses coincent
     * */
            	if (buffer.toString() == "ok") {
            		form = new Form ("Connection...");
            		setCommands (form,false);
            		display.setCurrent(form);
     
     
            	} else if (buffer.toString() == "erreur d'authentification") {
            		mainscreen("erreur d'authentification");
            	}
     
     
    	}
     
      }
    Une aide me serait vraiment précieuse.
    Images attachées Images attachées   

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Connexion HTTP
    Par Marc_P dans le forum Windows Mobile
    Réponses: 1
    Dernier message: 24/07/2007, 09h53
  2. plusieurs connexions http
    Par abou_alkassim dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 01/12/2006, 14h24
  3. connexion http par midlet
    Par javert dans le forum Java ME
    Réponses: 1
    Dernier message: 22/09/2006, 22h09
  4. Probleme connexion HTTPS
    Par fxp17 dans le forum Apache
    Réponses: 5
    Dernier message: 04/08/2006, 11h55
  5. [web] Connexion http avec ID et PW
    Par Batou dans le forum Web
    Réponses: 2
    Dernier message: 07/03/2005, 08h03

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