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

Android Discussion :

Client TCP "de base"


Sujet :

Android

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut Client TCP "de base"
    bonjour,
    je teste une connexion entre mon smartphone client et un pc serveur pour mettre en place une activité de programmation Android.
    Je l'ai d'abord testée entre deux PC en wi-fi. Cela fonctionne bien.
    Je reprend le code du client et l'adapte au smartphone et j'ai un pb de réception de ce qui revient du serveur.
    Le dialogue client/serveur est géré dans un thread.
    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
     
    public void run()
    {
    	try
    	{
    		service = new Socket(serverAddr, port);
    		//on récupère l'objet qui permet d'écrire dans la socket
    		PrintWriter pw = new PrintWriter(new OutputStreamWriter(service.getOutputStream()));
    		BufferedReader bf = new BufferedReader(new InputStreamReader(service.getInputStream()));
    		//écriture sur la socket
    		pw.print("Oye_oye");
     
    		//réceptionner la réponse du serveur
    		String what = bf.readLine();
    Lorsque je commente la ligne bf.readLine le serveur reçoit la chaîne Oye-oye. Je peux relancer la connexion autant de fois que nécessaire.
    Si je la décommente, plus de réception de la part du serveur et il est est bloqué.

    Ai-je oublié quelque chose spécifique à Android?

    Merci.

  2. #2
    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
    Je suppose que ton client n'a rien à lire tant que ton serveur n'a pas reçu le oye oye et répondu. Ajoute une flush après ton pw pour être sur que tout a bien été envoyé sur le réseau, que ça ne reste pas dans des buffers internes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		//écriture sur la socket
    		pw.print("Oye_oye");
                    pw.flush();

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    merci pour votre réponse mais le pb reste entier.

    J'ai bêtement remplacé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String what = bf.readLine();
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String what = "pour voir";
    Rien de bloquant, le dialogue client/serveur est mené de bout en bout et je construis bien par la suite le message à renvoyer depuis le thread vers l'activité et ce à chaque appel du thread.
    Ce qui me chiffonne le plus: le code client côté Android et côté pc est le même et ça ne fonctionne pas...

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    une chose dont je viens de m'apercevoir.

    Quand je lance mon client, le serveur affiche:
    Connexion acceptée (suite au accept)
    192.168.0.25 est connecté (suite à getInetAddr)
    Et bloque à ce niveau sur la lecture du flux client.

    Au bout d'un certain temps (voire un temps certain), Android affiche un message me prévenant que mon application est arrêtée et me propose d'en sortir.
    A ce moment, le dialogue client/serveur se débloque et le serveur affiche:
    Reception du message : Oye-oye
    Serveur en attente sur le port 11100

    Et je peux repartir pour un tour.
    Même chose si je force l'arrêt de l'application dans le gestionnaire.

    Pour ne pas rester inactif, je déploie l'artillerie lourde et met en route Wireshark pour espionner ce qui se passe entre les machines.

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Faudrait voir le code coté serveur alors ....


    Un envoi fonctionne "presque" toujours instantannément.
    Une lecture par contre est "bloquante" (par défaut), donc si le serveur n'envoie rien en retour...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    Sous Android tu ne peux pas utiliser de méthode bloquante (comme un read()) en "premier plan". C'est pourquoi un message d'erreur s'affiche indiquant que ton appli ne repond pas.
    Ils faut faire ces taches en arrière plan. regarde cet exemple de transfert : exemple.
    Il utilise la classe AsyncTask qui te permet de lancer un process en background.
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  7. #7
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Le serveur répond bien en retour, mon code fonctionne parfaitement en wifi entre deux pc.
    J'ai regardé via Wireshark ce qui est échangé entre client et serveur.
    Entre les deux pc, j'ai la séquence:
    SYN
    ACK
    PSH , ACK trame dans laquelle je vois bien le message Oye-oye du client
    ACK
    FIN , ACK

    Entre smartphone, je vois:
    SYN
    ACK
    PSH , ACK trame dans laquelle je vois bien le message Oye-oye du client
    puis TCP Retransmission
    ou rien du tout

    Je vais reprendre côté serveur, mon BufferedReader et son readLine() semble poser souci.

  8. #8
    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


    readLine attends un retour à la ligne ou la fin de transmission. Jamais ton code android n'envoie ce retour à la ligne sur ce flux. Le seul moyen pour que readLine retourne du coté server reste donc que la transmission se clôture (kill de l'application).

    Ce code ne peux d'ailleurs pas marcher avec un pc non plus, tu as du rajouter le retour à la ligne dans ton code pc sans t'en rendre compte.

  9. #9
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Drowan : Je voyais le code à l'intérieur d'un "run()" je me disais qu'il était déjà dans un thread, auquel cas les fonctions bloquantes ne sont pas un problème.

    Oui, il me semble qu'il manque un println au lieu de print

    D'autant que sur PC, les fin de lignes ne sont pas les mêmes que sur Android (Linux) ....
    Entre 0xD 0xA (sous PC) et 0xD tout court sous Linux..... si le PC attend le 0xA ça risque d'etre long
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. Réponses: 17
    Dernier message: 28/10/2005, 11h59
  2. Client Tcp/ Serveur TCP
    Par Phébus dans le forum Web & réseau
    Réponses: 2
    Dernier message: 21/07/2005, 16h35

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