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

Langage Java Discussion :

Migration PHP > Java


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut Migration PHP > Java
    Bonjour,
    je cherche à ré-écrire une application (écrite en PHP) en Java. Voici comment j'ai conçu l'appli pour le langage PHP :

    1. Récupération dans un fichier de configuration de l'ensemble des protocoles à gérer ainsi que des ports d'écoute associés (eg: ftp => 21, http => 80 etc...)
    2. Pour chacun des ports, ouverture d'un socket d'écoute.
    3. Création d'une boucle infinie (eg: while(true)) qui :
      • Accepte les connections sur le port d'écoute, lui attribut un nouveau port et créer une nouvelle session correspondant (new session($socket)).
      • Traite les actions liées aux sessions (function iterate()).
    4. Fermeture de tous les sockets encore ouverts.

    Ensuite ces 4 étapes sous enfermés dans une boucle infinie.

    Concernant l'objet session appelé par la classe server, il se limite à une serie de méthodes :
    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
     
    class session {
       private $sock; // Socket d'écoute
       private $data; // Socket de données pour les connection passives (eg: FTP)
       private $pasv; // Booleen (true:mode passif;false:mode actif)
       private $tt; // Tranfert Type (Binaire ou ASCII)
       private function __construct($sock) // Stocke le socket $sock dans la varible $this->sock;
       private function open() // Ouvre un nouveau socket
       private function read() // Lit le données
       private function write() // Ecrit la reponse
       private function close() // Ferme la session
       private function error() // Error handler
       public function iterate() // Gère les réactions de l'object
    //...
    }
    Enfin pour chaque protocol supporté, une nouvelle classe session_{protocol} étend les fonctionnalité de la classe session en suchargeant la function iterate().

  2. #2
    Membre éclairé Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 672
    Points
    672
    Par défaut
    ok, c'est cool tout ça mais il y a une question ? un problème ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    AH oui j'ai oublié la question

    Le probleme actuel est que je n'arrive pas a gerer les piles sous Java comme je le fais sous PHP avec les arrays. Existe-t-il une solution pour 'naviguer' dans un tableau associatif? A l'instar de foreach ou des fonction PHP in_array et array_search...

  4. #4
    Membre éclairé Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 672
    Points
    672
    Par défaut
    Citation Envoyé par rramy Voir le message
    Le probleme actuel est que je n'arrive pas a gerer les piles sous Java comme je le fais sous PHP avec les arrays. Existe-t-il une solution pour 'naviguer' dans un tableau associatif? A l'instar de foreach ou des fonction PHP in_array et array_search...

    Pour ça, je te renvoie à la FAQ sur les collections: http://java.developpez.com/faq/java/...angage_donnees

    mais aussi à l'API Java pour les méthodes qui existent sur les collections .

    Je pense qu'avec ça, tu devrais t'en sortir facilement.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Mon 1er rapport d'erreur en Java
    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
    package ab;     
    
    import java.io.*;
    import java.net.*;
    import java.util.*;
    
    public class Main {    
        private static Map prot;
        private static Map sock;
        
        public static void main(String[] args) throws IOException {
            System.out.println("Hello world!");        
                     
            // Listening Ports
            prot.put(21,"ftp");
            prot.put(80,"http");
                
            // Listening Sockets
            Integer k;
            String v;
            Iterator i = prot.entrySet().iterator();
            while (i.hasNext()) {
                Map.Entry m = (Map.Entry) i.next() ;
                k = (Integer) m.getKey();
                v = (String) m.getValue();
                
                System.out.println(k + " => " + v);
            }    
        }
    }
    L'execution de ce code me renvoit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    init:
    deps-jar:
    Compiling 1 source file to D:\Mes docs\NetBeansProjects\ab\build\classes
    Note: D:\Mes docs\NetBeansProjects\ab\src\ab\Main.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.
    compile-single:
    run-single:
    Hello world!
    Exception in thread "main" java.lang.NullPointerException
            at ab.Main.main(Main.java:15)
    Java Result: 1
    BUILD SUCCESSFUL (total time: 0 seconds)
    RQ: La ligne 15 est mise en gras dans le code.
    Et je n'ai aucune idée de ce qui cloche...

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    325
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 325
    Points : 228
    Points
    228
    Par défaut
    Il faut que tu initialises tes collections. Ici tu ne fais que les déclarer, mais elles sont toujours "null" au moment où tu les utilises.
    Tu peux écrire un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private static Map prot = new HashMap();
    private static Map sock = new HashMap();
    D'après ce que tu écris et si tu es en java 5 ou ultérieur, tu peux même écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private static Map<Integer, String> prot = new HashMap<Integer, String>();
    private static Map<Integer, Stirng> sock = new HashMap<Integer, String>();

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    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
    package ab;
    
    import java.io.*;
    import java.net.*;
    import java.util.*;
    
    public class server extends Thread {
        private Map<Integer,String> prot = new HashMap<Integer,String>();
        private Map<Integer,ServerSocket> sock = new HashMap<Integer,ServerSocket>();
        
        @Override
        public void start() {           
            // Listening Ports
            this.prot.put(21,"ftp");
                
            // Listening Sockets
            Iterator i = this.prot.entrySet().iterator();
            Map.Entry m;
            Integer k;
            while (i.hasNext()) {
                m = (Map.Entry) i.next();
                k = (Integer) m.getKey();            
                
                try {this.sock.put(k,new ServerSocket(k));} 
                catch (IOException e) {}
            }           
        }
        
        @Override
        public void run() {
            while(true) {
                Iterator i = this.sock.entrySet().iterator();
                Map.Entry m;
                ServerSocket v;
                while (i.hasNext()) {
                    m = (Map.Entry) i.next();
                    v = (ServerSocket) m.getValue();
                    
                    try {client c = new client(v.accept());}
                    catch (IOException e) {}
                }
            }
        }
        
        @Override
        public void finalize() {
            // ...
        }
    
    }
    Questions :
    • Est-ce que d'enregistrer systématiquement les nouveaux clients dans la variable 'c' plutot que dans une pile va poser problème (eg: l'ecrasement de 'c' va-t-il terminer les threads precedemment lancés => code en gras) ?
    • Pourquoi utiliser HashMap plutot que Map dans la declaration des piles?
    • Faire de la classe server un thread est-il judicieux ?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Voila ou j'en suis :
    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
    package ab;
    
    import java.io.*;
    import java.net.*;
    import java.util.*;
    
    public class server {
        private static Map<Integer,String> prot = new HashMap<Integer,String>();
        private static Map<Integer,ServerSocket> sock = new HashMap<Integer,ServerSocket>();
        
        public static void main(String[] args) {        
            // Listening Ports
            prot.put(21,"ftp");
                
            // Listening Sockets
            Iterator i = prot.entrySet().iterator();
            Map.Entry m;
            Integer k;
            while (i.hasNext()) {
                m = (Map.Entry) i.next();
                k = (Integer) m.getKey();            
                
                try {sock.put(k,new ServerSocket(k));} 
                catch (IOException e) {}
            }  
            
            while (true) iterate();
            
            // ...
        }
        
        public static void iterate() {        
            Iterator i = sock.entrySet().iterator();
            Map.Entry m;
            ServerSocket v;
            while (i.hasNext()) {
                m = (Map.Entry) i.next();
                v = (ServerSocket) m.getValue();
                
                try {new client(v.accept());} 
                catch (IOException e) {}            
            }
        }
    }
    
    class client extends Thread {
        private Socket sock,data;    
        private PrintWriter sos,dos;
        private BufferedReader sis,dis;
        
        private String psd;
        private String pwd;
        private String dir = "/";
        private String tt;
    
        client(Socket sock) {
            this.sock = sock;        
            try {
                this.sos = new PrintWriter(this.sock.getOutputStream());
                this.sis = new BufferedReader(new InputStreamReader(this.sock.getInputStream()));
            } catch (IOException e) {}
                   
            this.send("220 about:blank [alphaTest]...");
            this.start();
        }
        
        public void run() {
            String data = null;
            try {
                while ((data = this.sis.readLine()) != null) {
                    System.out.println("client@" + this.sock.getInetAddress().toString() + ":" + this.sock.getPort() + ": " + data);
                    this.iterate(data);
                }
            } catch (IOException e) {}
        }
      
        protected void finalize() {
            try {
                this.sos.close();
                this.sis.close();
                this.sock.close();
            } catch (IOException e) {}
        }
        
        private void send(String msg) {
            System.out.println("server@" + this.sock.getInetAddress().toString() + ":" + this.sock.getPort() + ": "+msg);
            
            this.sos.println(msg);
            this.sos.flush();
        }
        
        private void iterate(String data) {        
            String cmd,prm,msg;
            
            if (data.length() > 3) {
                cmd = data.substring(0,4).trim();
                prm = data.substring(4).trim();
            } else {
                cmd = data.trim();
                prm = "";
            }
            
            if (cmd.equals("USER")) {
                this.psd = prm;
                msg = "331 Password required for " + this.psd;
            } else if (cmd.equals("PASS")) {
                this.pwd = prm;
                
                // ...
                
                msg = "230 User " + this.psd + " logged in from " + this.data.getInetAddress().toString();
            } else if (cmd.equals("SYST")) {
                msg = "215 UNIX Type: L8";
            } else if (cmd.equals("HELP")) {
                msg = "214-about:blank [alphaTest]\n"+
                        "214-Commands available:\n"+
                        "214-USER\n"+
                        "214-PASS\n"+
                        "214-SYST\n"+
                        "214-HELP\n"+
                        "214-QUIT\n"+
                        "214-PWD\n"+
                        "214 HELP command successful";
            } else if (cmd.equals("TYPE")) {
                if (prm.equals("A") || prm.equals("I")) {
                    this.tt = prm;
                    msg = "200 type set";
                } else {
                    msg = "501 Syntax error in parameters or arguments";
                }
            } else if (cmd.equals("PASV")) {
                for (int i=0;i<3;i++) {                
                    try {
                        this.data  = new Socket(this.data.getInetAddress(),(int) (Math.random() * (65536-1024)) + 1024);   
                        this.dos = new PrintWriter(this.data.getOutputStream());
                        this.dis = new BufferedReader(new InputStreamReader(this.data.getInputStream()));
                    } catch (IOException e) {}  
                    
                    if (this.data.isBound()) break;
                }
                
                msg = this.data.isBound() ? 
                    "227 Entering Passive Mode (" + this.data.getLocalAddress().toString().replace(".",",") + "," + (this.data.getPort() >> 8) + "," + (this.data.getPort() & 0xFF) + ")": 
                    "452 Can't open data connection";       
            } else if (cmd.equals("LSIT")) {
                if (!this.data.isBound()) {
                    msg = "425 Can't open data connection";
                } else {
                    this.send("150 Opening  " + this.tt() + " data connection");
                    
                    // ...
                    
                    msg = "226 Transfer complete";
                }
            } else if (cmd.equals("QUIT")) {
                msg = "221 Disconnected from about:blank [alphaTest] FTP Server";  
                // ...
            } else if (cmd.equals("PWD")) {
                msg = "257 \"" + this.dir + "\" is current directory";
            } else if (cmd.equals("CWD")) {
                this.dir += "/" + prm;
                
                msg = "450 Requested file action not taken";
                msg = "250 CWD command succesful";	
            } else {            
                msg = "502 Command not implemented";
            }
            
            this.send(msg);
        }
        
        private String tt() {return this.tt.equals("A") ? "ASCII mode" : "Binary mode";}
        private String eol() {return this.tt.equals("A") ? "\r\n" : "\n";}
    }
    A l'execution de ce script, j'obtiens l'erreure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    server@/127.0.0.1:3122: 220 about:blank [alphaTest]...
    client@/127.0.0.1:3122: USER ramy
    server@/127.0.0.1:3122: 331 Password required for ramy
    client@/127.0.0.1:3122: PASS ********
    Exception in thread "Thread-2" java.lang.NullPointerException
            at ab.client.iterate(server.java:111)
            at ab.client.run(server.java:72)
    Les lignes 72 et 111 sont en gras dans le code.
    Quel est le probleme ici? Pour ce que j'en sais, java.lang.NullPointerException correspond à un object qui n'a pas été instancié. Dans ce cas, es-ce parce que client est appelé sans etre enregistré dans aucune variable?

    Merci de vos reponse ^^

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par rramy Voir le message
    Est-ce que d'enregistrer systématiquement les nouveaux clients dans la variable 'c' plutot que dans une pile va poser problème (eg: l'ecrasement de 'c' va-t-il terminer les threads precedemment lancés => code en gras) ?
    Non, par contre, l'intérêt est ici limité. Tu déclare instancie une classe "client" puis t'en fait plus rien et tu t'en débarasse. Tout dépend de ce que tu fait dans le constructeur de Client, mais, à priori, vu de l'extérieur, l'opération est vide de sens.
    Citation Envoyé par rramy Voir le message
    Pourquoi utiliser HashMap plutot que Map dans la declaration des piles?
    Map est une interface. Une interface est juste un contrat. On ne peut pas instancier une interface (elle a pas de code). HashMap est une des implémentation possible de la Map, une des plus courrement utilisées
    Faire de la classe server un thread est-il judicieux ?
    Tout dépend ^^. Si tu dois, dans ton main, lancer un ou plusieurs server et "aussi" faire autre chose, ou si tu veux un server par protocole, oui c'est judicieux.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par rramy Voir le message
    msg = "230 User " + this.psd + " logged in from " + this.data.getInetAddress().toString();
    soit this.data est null, soit this.data.getInetAddress() renvoie un null.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Non, par contre, l'intérêt est ici limité. Tu déclare instancie une classe "client" puis t'en fait plus rien et tu t'en débarasse. Tout dépend de ce que tu fait dans le constructeur de Client, mais, à priori, vu de l'extérieur, l'opération est vide de sens.
    Techniquement, la classe client est sensée recuperer et repondre aux requetes du client (FTP ici) connecté puis terminer apres la deconnection. Comme le fait remarquer tchize, cette erreur survient parce que this.data ou this.data.getInetAddress() est null cad que le socket est fermé. Or il n'y que la fonction finalize() qui ait le pouvoir de fermer le socket et si finalize() avait été appellé, le thread aurait du se terminé non?

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    soit this.data est null, soit this.data.getInetAddress() renvoie un null.
    Je viens de trouver mon erreur : un Ctrl+H qui a remplacé tous les this.sock en this.data (this.sock etant le soket d'ecoute et this.data le socket pasv) Du coup il est normal que this.data.getInetAddress() renvoit null puisque this.data est un socket qui n'a pas encore été ouvert.

    Ensuite, concernant ma question sur HashMap, elle portait surtout sur l'inetret d'utliser hashmap plutot que list, collection ou autre...

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par rramy Voir le message
    cette erreur survient parce que this.data ou this.data.getInetAddress() est null cad que le socket est fermé.
    Tu va un peu vite en conclusion là C'est pas parce que this.data est null que la connection a été fermée. De plus, c'est pas parce que tu ferme une connection que la socket est magiquement remplacée, dans toutes ses références par un null.

    Essaie déjà de déterminer lesquel des deux est null et pourquoi il l'est (System.out.println est vachement utile pour savoir ce qui est null :p)

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    Maintenant je n'arrive pas a envoyer le listing du repertoire. Voici le dialogue entre le serveur et le client FTP :
    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
    server@127.0.0.1:1218: 220 about:blank [alphaTest]...
    client@127.0.0.1:1218: USER ramy
    server@127.0.0.1:1218: 331 Password required for ramy
    client@127.0.0.1:1218: PASS *******
    server@127.0.0.1:1218: 230 User ramy logged in from 127.0.0.1
    client@127.0.0.1:1218: PWD
    server@127.0.0.1:1218: 257 "/" is current directory
    client@127.0.0.1:1218: TYPE I
    server@127.0.0.1:1218: 200 type set
    client@127.0.0.1:1218: PASV
    server@127.0.0.1:1218: 227 Entering Passive Mode (127,0,0,1,4,195)
    client@127.0.0.1:1218: LIST
    server@127.0.0.1:1218: 150 Opening  Binary mode data connection
    server@0.0.0.0:1219: -rw-r--r--  1 11231    wsstaff      2535 	Mar 25 08:55 httpd-access-patch
    server@0.0.0.0:1219: -rw-r--r--  1 11231    wsstaff    294857 	Mar 25 08:54 httpd_decaxp.tar.Z
    server@0.0.0.0:1219: -rw-r--r--  1 11231    wsstaff   2179072 	Mar 25 08:54 httpd_docs.tar
    server@0.0.0.0:1219: -rw-r--r--  1 11231    wsstaff    315487 	Mar 25 08:54 httpd_hp.tar.Z
    server@0.0.0.0:1219: -rw-r--r--  1 11231    wsstaff    297560 	Mar 25 08:54 httpd_rs6000.tar.Z
    server@0.0.0.0:1219: -rw-r--r--  1 11231    wsstaff    462367 	Mar 25 08:54 httpd_sgi.tar.Z
    server@0.0.0.0:1219: -rw-r--r--  1 11231    wsstaff    151017 	Mar 25 08:54 httpd_source.tar.Z
    server@0.0.0.0:1219: -rw-r--r--  1 11231    wsstaff    206465 	Mar 25 08:54 httpd_sun4.tar.Z
    server@127.0.0.1:1218: 226 Transfer complete
    Je pense que le probleme vient de la maniere dont l'application reagit à la commande PASV (eg: choix par le serveur d'un port d'ecoute pour la communication des donnees). D'apres mes recherches, la methode la plus repandu pour ouvrir un tel socket est la suivante :
    1. Creer une socket d'ecoute sur un port quelconque
    2. Recuperer le port d'ecoute de ce nouveau socket via la methode getLocalPort(); de l'objet serversocket et le communiquer au client
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      227 Entering Passive Mode (addr,port)
    3. Lors d'une requete necessitant d'envoyer des donnees au client
      1. Ouvrir le socket si ce n'est pas deja fait
      2. Envoyer les donnees
      3. Fermer le socket


    Comme on peux le voir dans le logs ci-dessus, le serveur communique un bon n° de port au client mais le socket ouvert par la methode accept() de l'objet serversocket ecoute sur une adresse étonnante (eg: 0.0.0.0). Quel en est la raison?

    PS : Les tests sont fait en local, peut-etre es-ce la raison de ce probleme...

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    0.0.0.0 signifie qu'il écoute sur toutes les adresses présentes dans ta machine en même temps. C'est le comportement par défaut d'un socket quand tu lui précise pas sur quelle adresse elle doit ouvrir son port d'écoute. Généralement on s'en fout Sauf quand la machinesur laquelle tourne le serveur a plusieurs adresse ip et qu'on veux que l'écoute n'aie lieu que sur un seul des réseau (une seule ip)

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Le socket ecoute sur toutes les adresses dispo sur la machine > ok

    Mais alors que ce passe-t-il lorsque j'envoi des donnees sur un tel socket?
    Il envoit les donnes via toutes les adresses de la machine?

  17. #17
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    La connection s'établi entre deux point, donc forcément, il répond sur l'interface qui a initié la connection. Note que c'est l'OS qui gère tout çà

    Basiquement:

    1) serveur écoute sur *:6969
    2) un client se connecte sur 1.2.3.4:6969
    3) le serveur répond au client à partir de l'interface 1.2.3.4, le handshake a lieu entre client et serveur
    4) la connection de point à point est établie entre 1.2.3.4:6969 et l'interface:port du client

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    OK

    Du coup, ça ne pose pas de probleme de realiser les tests en local du moment qu'un port de communication est clairement definit.

    De plus, j'ai reussi a trouver une solution pour l'ouverture d'un socket de donnees :
    1. Initier un serversocket sur le port voulu (0 si indiferrent)
    2. Concerver le serversocket ouvert afin de bloquer le port
    3. Lors d'un envoi de donnees :
      1. Liberer le port d'ecoute en fermant le serversocket
      2. Ouvrir un socket sur l'adresse et le port de ce dernier
      3. Envoyer les donnees via ce nouveau socket
      4. Fermer le socket

    Cette methode semble viable mais le client FTP ne daigne pas afficher le repertoire ainsi liste... Voici les logs du server :
    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
     
    [...]
    client@127.0.0.1:2058 > PWD
    server@127.0.0.1:2058 > 257 "/" is current directory
    client@127.0.0.1:2058 > TYPE I
    server@127.0.0.1:2058 > 200 type set
    client@127.0.0.1:2058 > PASV
    server@127.0.0.1:2058 > 227 Entering Passive Mode (192,168,0,1,8,11)
    client@127.0.0.1:2058 > LIST
    server@127.0.0.1:2058 > 150 Opening Binary mode data connection
    server@192.168.0.1:2059 > -rw-r--r-- 1 ramy           ramy           177096492      Feb 06 07:55 How I Met Your Mother - 03x01 - Wait For It.avi
    server@192.168.0.1:2059 > -rw-r--r-- 1 ramy           ramy           182564580      Feb 06 07:55 How I Met Your Mother - 03x02 - We're Not From Here.avi
    server@192.168.0.1:2059 > -rw-r--r-- 1 ramy           ramy           183605248      Feb 06 07:55 How I Met Your Mother - 03x03 - Third Wheel.avi
    server@192.168.0.1:2059 > -rw-r--r-- 1 ramy           ramy           183507562      Feb 06 07:55 How I Met Your Mother - 03x04 - Little Boys.avi
    server@192.168.0.1:2059 > -rw-r--r-- 1 ramy           ramy           183549932      Feb 06 07:55 How I Met Your Mother - 03x05 - How I Met Everyone Else.avi
    server@192.168.0.1:2059 > -rw-r--r-- 1 ramy           ramy           182974500      Feb 06 07:55 How I Met Your Mother - 03x06 - I'm Not That Guy.avi
    server@127.0.0.1:2058 > 226 Transfer complete
    et voici le log du client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Statut :	Connecté
    Statut :	Récupération du contenu du répertoire...
    Commande :	PWD
    Réponse :	257 "/" is current directory
    Commande :	TYPE I
    Réponse :	200 type set
    Commande :	PASV
    Réponse :	227 Entering Passive Mode (192,168,0,1,8,11)
    Commande :	LIST
    Réponse :	150 Opening Binary mode data connection
    Réponse :	226 Transfer complete
    Statut :	Lecture du contenu du répertoire achevée.
    Je precise que le client semble bien recevoir les informations (eg: sinon une erreure pour timeout devrait se declencher...). Pour vous eviter de faire le calcul 8*256+11=2059 donc le port d'ecoute est viable. Enfin le listing est un copier-coller du retour de la commande ls -l de mon home.

    Et donc je ne comprend pas le probleme...
    Pas de message d'erreur...

    PS : Connaissez-vous un soft pour voir les donnees envoyee via le second socket?

Discussions similaires

  1. Migration PHP -> Java
    Par bardyna dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 12/09/2013, 10h22
  2. Que choisir : PHP versus Java ?
    Par Sniper37 dans le forum Général Conception Web
    Réponses: 164
    Dernier message: 28/04/2009, 16h50
  3. Migration PHP > Java : Abstraction
    Par rramy dans le forum JDBC
    Réponses: 1
    Dernier message: 21/05/2008, 17h29
  4. [Tomcat]échange de session entre php et java
    Par benwa dans le forum Tomcat et TomEE
    Réponses: 18
    Dernier message: 05/06/2007, 17h01
  5. [JSP/Tomcat] Intégration de PHP dans Java
    Par milhouz_deglingos dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 17/08/2005, 12h02

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