Probleme de communication entre client-serveur en Java
adabla
-
brupala Messages postés 112026 Date d'inscription Statut Membre Dernière intervention -
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
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:
- Probleme de communication entre client-serveur en Java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Cybera client - Télécharger - Divers Réseau & Wi-Fi
- Changer serveur dns - Guide
- Eclipse java - Télécharger - Langages
2 réponses
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 :-)
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 :-)
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.
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.
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.
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.