Besoin d'aide sur une application Client/Serveur
Résolu/Fermé
A voir également:
- Besoin d'aide sur une application Client/Serveur
- Formate pour taxer client connexion ✓ - Forum Matériel informatique
- Formate pour taxer client 500€ - Forum Consommation et internet
- Aucune application permettant d'ouvrir ce lien n'a été trouvée ✓ - Forum Wiko
- Association avec le serveur freebox en cours ✓ - Forum Freebox
- Application youtube mp3 - Guide
1 réponse
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
3 déc. 2017 à 19:45
3 déc. 2017 à 19:45
Bonjour,
Le problème c'est que le port doit être ouvert côté serveur avant que le client n'essaie de se connecter dessus.
Or ici au moment où ton client devient serveur et où ton serveur devient client il y a un conflit, notamment parce que le serveur n'a pas fermé sa première connexion.
Le mieux serait d'utiliser deux ports, un dédié à chaque programme qu'ils démarreront en tant que serveur.
Remarque : du coup ça n'a plus trop de sens que le premier programme s'appelle Serveur et le deuxième Client, car en fait ils ont tous le double rôle.
Le problème c'est que le port doit être ouvert côté serveur avant que le client n'essaie de se connecter dessus.
Or ici au moment où ton client devient serveur et où ton serveur devient client il y a un conflit, notamment parce que le serveur n'a pas fermé sa première connexion.
Le mieux serait d'utiliser deux ports, un dédié à chaque programme qu'ils démarreront en tant que serveur.
Remarque : du coup ça n'a plus trop de sens que le premier programme s'appelle Serveur et le deuxième Client, car en fait ils ont tous le double rôle.
3 déc. 2017 à 21:23
Du coup j'ai utilisé la méthode de la classe ServerSocket dans le programme client alors qu'elle était pour moi strictement réservée au programme serveur.
Il n'empêche que je ne saisi pas pourquoi je devais aussi utiliser un autre numéro de port (pour le deuxième message) en essayant de fermer la première connexion par la méthode socket.close() glissé, bien entendu, au dessus de la partie du programme où je crée la réponse.
La connexion ne se ferme que lorsque le programme entier a fini de s'exécuter ?
Si jamais quelqu'un a une idée !
Modifié le 3 déc. 2017 à 22:57
La connexion se ferme quand tu le demandes côté "serveur", cependant le "client" ne peut pas savoir à quel moment cela se produit et donc quand il peut réutiliser le port, c'est pour ça qu'il vaut mieux utiliser un deuxième port, dont le "client" sera sûr qu'il est disponible à tout moment puisqu'il est le seul à l'utiliser, la connexion du "serveur" peut donc être fermée n'importe quand, ça n'empêchera pas le "client" de fonctionner.
Remarque : dans un cas d'usage plus complexe, où tu échangerais plusieurs messages de l'un vers l'autre, c'est clairement la solution à deux ports qui fonctionne le mieux, parce que ça te permet de garder les deux connexions ouvertes en même temps (full-duplex) et d'échanger autant de messages que tu veux dans un sens ou dans l'autre sans avoir à ouvrir et fermer des connexions à chaque fois (half-duplex).
Exemple :
import java.io.*; import java.net.*; public class FullDuplex implements AutoCloseable { private final BufferedReader in; private final BufferedWriter out; public FullDuplex(String host, int serverPort, int clientPort, long connectDelay) throws IOException { ServerSocket acceptSocket = new ServerSocket(serverPort); Socket serverSocket, clientSocket; try { clientSocket = new Socket(host, clientPort); serverSocket = acceptSocket.accept(); } catch (ConnectException e) { serverSocket = acceptSocket.accept(); clientSocket = new Socket(host, clientPort); } acceptSocket.close(); in = new BufferedReader(new InputStreamReader(serverSocket.getInputStream())); out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); } public String readLine() throws IOException { String line = in.readLine(); System.err.println("Server << " + line); return line; } public void writeLine(String line) throws IOException { System.err.println("Client >> " + line); out.write(line); out.newLine(); out.flush(); } @Override public void close() throws IOException { out.close(); in.close(); } }public static void main(String[] args) throws IOException { FullDuplex common = new FullDuplex("localhost", 1026, 1027, 500); common.writeLine("What's your name ?"); String name = common.readLine(); common.writeLine("Hello " + name + " !"); common.close(); }public static void main(String[] args) throws IOException { FullDuplex common = new FullDuplex("localhost", 1027, 1026, 500); common.readLine(); common.writeLine(System.getProperty("user.name")); common.readLine(); common.close(); }3 déc. 2017 à 22:25
En tout cas merci beaucoup pour ton code, ça va me servir pour approfondir le sujet