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 :

lecture socket avec read une fois seulement


Sujet :

Entrée/Sortie Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut lecture socket avec read une fois seulement
    Bonjour,

    je ne sais pas si quelqu'un a deja eu ce probleme, mais dans mon aplli lorsque que je lis la socket via in.read(bytearr, off, len) ca fonctionne la premier fois mais a la prochaine fois ca ne marche plus, il trtourne toujours -1 alors qu'il devrait lire des donnees.

    peut etre un flush de in mais ca existe pas comme methode, ou bien reouvrire la socket dans la boucle.

    Quelqu'un a une idee ?

    Merci de votre aide.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    Quelqu'un a une idee le pourquoi le read lit une seul fois et apres il lit plus, il reste bloquee sur le in.read et renvoi toujours -1, alors qu'il y a des donnees a recuperer ?

    Ai-je oublie d'initialiser quelque chose ?

    Merci

  3. #3
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Salut,

    Sans bout de code on ne peut pas t'aider. Donne nous la partie du code qui envoi les données sur la socket et celle qui lit les données.

    A+
    Hydraland

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    je ne peux pas te donnee de bout de car ce qui envoi les donnees est des centaine de kilometre, c'est un boitier electronique, mais de toute facon le programme en c sous linux fonctionne tres bien , ca viens de la structure de mon prog en java

    j'aimerais a voir un exemple le plus simple possible d'un client serveur dans une boucle.


    - la boucle avec l'accept, ou mettre l'accept ?
    a l'interieur de la boucle ou pas ?
    les in et out inputstream faut-il les mettre en dehors de la boucle ou dans la boucle?
    faut-il les initialises a l'interieur de la boucle ?

    actuellement mon prrog a la structure suivante:

    Init du socket serveur

    While true

    accept du socket client

    lecture dess data avec read

    traitement des donnees

    envoi de packet

    retour boucle while true

    Merci.

  5. #5
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Un petit exemple incomplet d'un serveur qui tourne dans un Thread:
    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
    public final void run()
    	{
    		try
    		{
    			while(!serverThread.isInterrupted())//On test l'arrêt du serveur
    			{
    				Socket sock = socket.accept();//On a une nouvelle connexion
    				ServerConnector connector = new ServerConnector(sock.getInputStream(), sock.getOutputStream()); //ServerConnector est un Thread qui traite la demande
    				connector.start(); //On lance le Thread
    			}
    		}
    		catch (IOException ioe)
    		{
    			ioe.printStackTrace();
    		}
    	}
    Puisque c'est toi qui fait le serveur tu peux donc nous montrer ton code .

    A+
    Hydraland

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    oui mais en fait je fais le serveur mais le client aussi car je repond au requete du
    client , donc ca fait client aussi.

    mais je debute si je n'ai un une structure d'un minimum client serveur je vais pas m'en sortir, dans ton code tu gere ou les donnee cliente ?

    le in.read tu le met ou ?

    Merci.

  7. #7
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    C'est dans la classe ServerConnector. Je ne suis pas au boulot donc je ne peut pas te la montrer . Mais bon elle devrait ressembler à celà :
    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
    public class ServerConnector implements Runnable
    {
    private InputStream in;
    private OutputStream out;
    public ServerConnector(InputStream in, OutputStream out)
    {
    this.in = in;
    this.out = out;
    }
    public void run()
    {
    in.read(...);//Lecture des données
    //traitement des donnée
    out.write(...)//Envoi des résultats au client
    }
    }
    C'est pas très compliqué de faire du client/serveur avec Java, prend un bout de papier et dessine les échanges entre tes clients et ton serveur, puis tu codes se que tu as mis sur papier.

    PS : Ce n'est pas parce que le serveur répond au client qu'on peut dire que c'est un client.

    A+
    Hydraland

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    merci ca va m'aider l'exemple, mais en fait le protocol:e que j'utilise est particulier, c'est a dire que le client m'envoi une trame, je traite cette trame, j'envoi une commande et apres le client m'envoi que des donnees et je dois les traites mais je n'envoi plus rien au client, en fait c'est comme si je faisait une seul fois un accept apres c'est fini je traite toute els donnees et au bout d'un certain temps (2 minute environ) le client recommence etc ..

    et justement mon probleme c'est qu'il bloque au in.read il attend indefiniment, donc je pensait peut que ca pouvait venir de mon prog qui n'est pas en thread.

    Merci.

  9. #9
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Salut,

    La méthode read de InputStream est bloquante. Elle rend la main si elle reçoit des données ou si la connexion est cloturée.
    Quand tu dis que ton client recommence est ce qu'il redemande une connexion au serveur? Je m'explique. Quand un client ce connecte à un serveur(par ex le port 1025) le serveur ouvre dynamiquement une socket sur un autre port (méthode accept) pour communiquer avec lui et ainsi permettre à d'autre client de se connecter. Ensuite le client et la partie du serveur qui traite la demande du client(En général un thread) communique entre eux sur la socket ouverte dynamiquement. Quand ils ont terminé de communiquer il faut clôre la socket ouverte dynamiquement.
    Je pense que si tu bloque sur le in.read c'est que ton client ne clôt pas la socket ouverte dynamiquement et s'il ne t'envoie pas de donnée sur cette socket c'est qu'il doit essayer d'ouvrir une nouvelle connexion.

    Bon courage,
    A+
    Hydraland

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/11/2010, 16h07
  2. sa_handler une fois avec un & une fois sans ?!
    Par marion5515 dans le forum POSIX
    Réponses: 3
    Dernier message: 13/10/2009, 10h43
  3. Réponses: 5
    Dernier message: 25/11/2008, 10h41
  4. pb avec function une fois externalisée
    Par antrax2013 dans le forum ASP
    Réponses: 3
    Dernier message: 23/03/2006, 16h48

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