CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Socket Java [Android]

Fire_Storm
Fire_Storm
Niveau 10
21 février 2014 à 17:13:47

Bonjour.

J'essaye depuis quelques temps de faire une messagerie instantanée sur Android.

Tout allait plutôt bien jusqu’à ce que je me rende compte que ma messagerie n'aurait rien d'instantané si j'utilisais des connexions HTTP simplement.

On m'a donc dit de faire avec des sockets asynchrones, le truc c'est que je n'ai jamais touché aux sockets de ma vie (mais bon faut un première à tout).

Après des heures d'acharnements (je suis assez lent à la détente ^^) je pense être arrivé à quelque chose de plus ou moins correct mais y a un truc qui me pose problème malgré tout.

Je n'arrivais pas à envoyer des données au serveur (via un PrintWriter si je ne m'abuse) et je me suis rendu compte par hasard que ça marchait ... mais uniquement lors de la première connexion (et je ne sais vraiment pas pourquoi)

J'ai ouvert un sujet sur le sdz où j'ai posté mon code (pas le fouet, pas le fouet !) mais pas de réponse concrète et comme je sais qu'il y a des bons experts en Java (bon c'est pour Android mais je ne pense pas que ça soit si différent du Java "pur")

http://fr.openclassrooms.com/forum/sujet/socket-asynchrones-1

Si l'un de vous a une idée du problème ça serait vraiment sympa de sa part, je commence un peu à désespérer et je n'ai vraiment pas envie de balancer les dernières semaines de boulot à la poubelle juste pour ça.

Pour le AsyncTask c'est parce qu'Android ne permet plus d'utiliser ce genre de connexion sur le thread principal (ça c'était la prise de tête de la semaine dernière :p)

Merci d'avance.

Bunyan
Bunyan
Niveau 17
21 février 2014 à 17:59:11

"Pour le AsyncTask c'est parce qu'Android ne permet plus d'utiliser ce genre de connexion sur le thread principal (ça c'était la prise de tête de la semaine dernière :p) "

Et les langages qui le permettent te laissent la liberté de NE SURTOUT PAS LE FAIRE !
Pas de traitement long sur le thread graphique, il ne faut pas geler le thread graphique, et c'est vrai pour Android ainsi que pour la très grande majorité des plate-formes.
La NetworkOnMainThreadException est une très bonne chose, permettant de voir les développeurs ayant des soucis avec les opérations asynchrone.

Ca, c'est fait.

Pour ton AsyncTask, tu peux faire retourner null (ou Void) à ton doInBackround, ça évitera les NPE en tentant d'utiliser le résultat.

Est-ce que le LogCat dit quelque chose au niveau des erreurs ? Car si ça fonctionne la première fois et pas ensuite, il doit y avoir une exception de levée, ou au moins un message quelconque.
Vu que tu utilises des printStackTrace, c'est pas dit que tu aies le retour dans le LogCat, donc remplace les par des Log.e(TAG, message, e); où TAG est un identifiant permettant de filtrer, message est un message explicatif et e est l'exception.
STDOUT est généralement redirigé vers le LogCat, mais ce n'est pas une garantie.

Tu devrais aussi essayer les try-with-resources, ou les try/finally (sans catch) ou au moins mettre en place des finally pour fermer proprement tes ressources.

Fire_Storm
Fire_Storm
Niveau 10
21 février 2014 à 18:23:45

C'est bien ça qui est étrange; aucune erreur quelconque.

Après c'est peut être mon serveur qui déconne (faut dire que je ne suis pas sur du code non plus)

Bunyan
Bunyan
Niveau 17
21 février 2014 à 18:34:19

Tu es sûr ? Le LogCat n'indique rien de particulier ?

Reste la solution du proxy : trace ta requête à travers pour voir déjà si tu pars.

Fire_Storm
Fire_Storm
Niveau 10
21 février 2014 à 18:42:25

Juste ça:

02-21 18:22:28.710: I/global(306): Default buffer size used in BufferedWriter constructor. It would be better to be explicit if an 8k-char buffer is required.

dark_drow
dark_drow
Niveau 15
21 février 2014 à 20:41:05

J'ai jamais vraiment programmés avec les socket java, par contre j'ai un peu d'expérience en C :)

1- Je ne comprends pas pourquoi tu appelle directement socket.close(); ? Ca devrait être la dernière ligne de ton programme non - à la fermeture du tchat

2- Tu n'a pas de code pour récupérer la réponse du serveur... ?

Je me suis rendu compte par hasard que ça marchait ... mais uniquement lors de la première connexion

socket.setReuseAddress(true) devrait régler ton soucis

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment