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

Entrée/Sortie Java Discussion :

TCP server socket


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2003
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 93
    Par défaut TCP server socket
    Bonjour,

    Je désire développer une application server qui écoute pour la connexion d'un client, mais une fois le client connecté j'aimerais que cette connexion reste permanente, lire ce que m'envoie le client et lui répondre.
    J'ai lu de la doc sur ServerSocket etc ...
    J'ai aussi essayé les exemples mais ca ne fonctionne pas.
    Mon server ne lit qu'une seule fois ce que m'envoie le client.

    Auriez vous un exemple concret de la facon dont je peux m'y prendre (je suis débutant)

    Merci d'avance,
    Christian

  2. #2
    Membre éprouvé Avatar de anisj1m
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    1 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 067
    Par défaut
    j'espere que cela peut t'aider

    www-sop.inria.fr/semir/personnel/Patrick.Itey/cours/reseau/pdf/java-net.pdf

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2003
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 93
    Par défaut
    Bonsoir,

    Je pense avoir trouvé pourquoi ca ne fonctionne pas.
    J'utilise un BufferedStreamReader readLine pour lire ce que le client m'envoie.
    Mais d'après la documentation il semble que readLine attende un "enter" ou "line feed" pour valider la ligne, hors mon client envoie "escape" comme caractère de fin de ligne.
    Avez vous une idée et un exemple pour contourner ce problème ?

    Merci d'avance,
    Christian

  4. #4
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    une fin de ligne en mode texte étant caractérisée par la présence de \n ou \n\r, ton flux doit être traité en binaire. Pour cela, n'utilise pas les "reader" et "writer". Utilise plutot BufferedInputStream et BufferedOutputStream.

    PS : il n'existe pas de classe BufferedStreamReader dans le JDK. C'est soit BufferedInputStream, soit BufferedReader...

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2003
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 93
    Par défaut
    Je progresse ...
    A présent grace à vos conseils ca fonctionne en partie.

    Mon seul problème c'est qu'il ne m'affiche jamais le premier caractere de la ligne ...

    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
     
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
     
    public class CSAPIServer {
     
    	public static void main(String [] args) throws IOException{
     
    		ServerSocket s = new ServerSocket(1415);
    	    System.out.println("Started: " + s);
    	    int pointer;
    	    while(true){
     
    	    	        Socket socket = s.accept();
    	    	        System.out.println("Connection accepted: "+ socket);
    	    	        BufferedInputStream inStream = new BufferedInputStream(socket.getInputStream());
     
    	    	        while ((pointer=inStream.read())!=-1){
     
    	    	    	String value ="";
    	    	    	     while((pointer=inStream.read())!=27){
    	    	    		 value=value+((char)pointer);
    	    	    		 }
    	    	    	System.out.println(value);
    	    	      	}
     
    	    	System.out.println("Closing the connection");
    	    	inStream.close();
    	    	socket.close();
     
    	   } 
    	}
    }
    Pouvez-vous à nouveau m'aider ?

    Merci d'avance,
    Christian

  6. #6
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    tu additionnes des choux et des carottes converties en haricots.
    plutot que d'utiliser des "int" et "char" que tu converties à partir de "byte", récupère tout en "byte" et au final tu décode "byte" en "String" selon le charset utilisé.

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2003
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 93
    Par défaut
    Merci beaucoup pour ta réponse, hélas je suis loin d'être un expert en Java.
    Aurais tu peut-être un exemple de code pour me guider ?

    Merci d'avance,
    Christian

  8. #8
    Membre confirmé
    Inscrit en
    Juillet 2003
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 93
    Par défaut
    Personne ne sait m'aider ?

    Merci d'avance,
    Christian

  9. #9
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    En général, on utilise un buffer de lecture plutôt que de faire de la lecture byte par byte... Et ce genre de code se trouve dans tous les tutoriaux de communication réseau!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    InputStream is = socket.getInputStream();
     
    byte [] buffer = new byte[1024];
    int read;
     
    StringBuffer sb = new StringBuffer();
     
    while ((read = is.read(buffer)) != -1) {	
       sb.append(buffer,0,read);
    }
    /* fermeture propre de tes flux, transformation de ton StringBuffer en String, etc... */
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  10. #10
    Membre confirmé
    Inscrit en
    Juillet 2003
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 93
    Par défaut
    Un grand merci pour ta réponse,
    J'ai essayé précedement de le lire avec un reader, mais comme le dit la documentation Java un reader se base sur une fin de ligne avec un carriage return et line feed, hors l'application termine ses lignes par escape.
    Donc ca ne fonctionnait pas, c'est la raison pour laquelle j'ai du choisir cette solution.

    Merci,
    Christian

  11. #11
    Membre confirmé
    Inscrit en
    Juillet 2003
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 93
    Par défaut
    Ton code me renvoie une erreur sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sb.append(buffer,0,read);
    The method append(CharSequence, int, int) in the StringBuffer is not applicable for the arguments (byte[], int, int)

  12. #12
    Membre confirmé
    Inscrit en
    Juillet 2003
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 93
    Par défaut
    J'ai remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sb.append(new String(buffer),0,read);
    Et ca semble fonctionner, est ce la bonne méthode ?

    Merci d'avance,
    Christian

Discussions similaires

  1. Connexion en vbs - TCP/IP - Socket
    Par Fragios dans le forum VBScript
    Réponses: 1
    Dernier message: 16/05/2008, 09h47
  2. Client/Server Socket ..
    Par Chyokyka dans le forum Débuter
    Réponses: 8
    Dernier message: 15/04/2008, 21h50
  3. client/server tcp, probleme socket
    Par Misaki dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 20/12/2007, 09h46
  4. UDP/TCP multithreading/sockets asynchrones
    Par narkotik dans le forum C++
    Réponses: 4
    Dernier message: 25/07/2006, 11h35

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