Probleme de communication entre client-serveur en Java

adabla -  
brupala Messages postés 112026 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai un soucis avec mon application client serveur en Java.

Voila c'est une application de tchat, en java, en utilisation les socket datagramme (DatagramSocket):

-Le serveur est à l'écoute d'un port
-le client possède une zone de texte pour son pseudo et un bouton pour s'enregistrer avant de dialoguer. Une fois qu'il valide le bouton d'enregistrement, son pseudo est envoyé au serveur via un DatagramPacket. Le serveur l'enregistre simplement sans message de retour et enregistre aussi l'adresse et le port du client
-Puis le client peut écrire le texte qu'il veut et l'envoyer à un autre client enregistré sur le tchat

Tout ce passe bien en local et tout fonctionne correctement. Nous avons testé plusieurs fois sur le réseau local (en 192.168.0.0/24) et on arrive à s’écrire et à s'envoyer des messages. Vraiment tout est ok. Le problème se passe une fois l'application déployée en ligne.
Une fois déployé, nous avons pris soin de changer l'adresse du serveur au niveau des clients et on utilise l'adresse publique du serveur maintenant.

Via des logs (println) sur le serveur, je me rends compte que le serveur reçoit bien les messages clients, mais une fois ces messages relayés au client destinataire, il ne reçoit rien. Lorsqu'on essai à nouveau en local, ça marche bien, mais une fois le serveur déployé, il reçoit les messages mais ne relaie pas ces messages.

Mon hypothèse est la suivante:
-puisque le serveur utilise l'adresse du client enregistrée lors de l'inscription du client, j'ai alors affiché sur le serveur cette adresse et c'est l'adresse publique de notre connexion internet (et pas l'adresse du sous réseau local du client qui est 192.168.0.0/24) . et je me dis que quand le serveur relaie le message, c'est à cette adresse publique+port qu'il relaie et le message ne parvient donc pas à l'émetteur.

Si mon hypothèse est bonne, alors comment régler cela? sinon si une personne comprend la cause du problème, je le remercie de partager son expérience pour le résoudre. Dans tous les cas, toutes vos hypothèses et solutions sont les bienvenues.

Merci merci

(PS: informations pouvant être utiles

-j'utilise simplement un DatagramPacket et DatagramSocket pour la connexion et l'envoi des packets réseau
-le serveur enregistre les pseudo des clients via un message formaté et aussi leur adresse IP+PORT en les extrayant du datagramPacket venant des clients
-une fois déployé, nous avons pris soin de modifier l'adresse du serveur que le client utilisait, en remplaçant par l'adresse publique du serveur
-client et serveur sont des applications Java lourd

Configuration: Linux / Firefox 78.0
A voir également:

2 réponses

brupala Messages postés 112026 Date d'inscription   Statut Membre Dernière intervention   14 174
 
Salut,
es tu sûr que ton serveur enregistre l'adresse publique du client et non son adresse privée locale (qui est la seule connue du côté client)
soit le serveur chope l'adresse dans le datagramme envoyé par le client, soit il la tire lui même de l'adresse ip source du paquet de connexion qu'il reçoit.
Au delà de ça, plus complexe, il existe plusieurs types de nat sur les firewall et les box.
suivant le type de nat, le client distant peut communiquer en réponse ou pas.
Hélas le type de nat n'est pas configurable et dépend de la cuisine interne de la box.
Le port utilisé source utilisé est le même que le port destination ?
En fait pour ne pas être emmerdé par la nat, il suffit d'utiliser ipv6 :-)

1
adabla
 
en faite, j'ai utilisé juste une clé de connexion 4g coté connexion du client pour faire simple.
Pour réponde à ta question, oui c'est bien l'adresse publique, puisque j'affiche l'adresse enregistré sur le serveur avec l'adresse local du client et l'adresse publique délivrée par mon fournisseur internet, et oui, c'est bien l'adresse IP publique du client.
Donc on peut utiliser IP6 en Java, jamais essayé, faut que je cherche de ce coté alors.
0
brupala Messages postés 112026 Date d'inscription   Statut Membre Dernière intervention   14 174 > adabla
 
il faut aussi que ipv6 soit actif sur la connexion internet, aussi bien côté client que serveur.
pour ce qui est du réseau mobile:
Attention, un réseau mobile, ce n'est pas tout à fait l'internet., ça passe par des proxy et des cgn, les adresses ip peuvent être carrément bidon.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Je redirige ta question vers le forum Réseau, je pense que c'est à ce niveau là qu'il faut intervenir, car vu ce que tu décris, modifier le programme Java ne résoudra pas le problème.
0
adabla
 
En fait je ne sais pas aussi si j'utilise les bons objets java ou si je dois modifier une partie.
Si c'est possible de poser le probleme sur les deux forums
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > adabla
 
Peut être qu'il y aura des adaptations à faire sur ton code, mais pour l'instant je ne saurais pas trop t'aiguiller, ça peut être juste un problème de pare feu qui bloque le message entrant ou je ne sais quelle subtilité qui dépasse mon domaine de compétences.
0