Bonsoir,
J'ai une appli client/serveur.
Les utilisateurs peuvent utiliser 3 types de clients. Mon client Java, Telnet ou un butineur.
Afin de pouvoir utiliser les méthodes adéquates j'ai besoin de savoir de quel type est mon client. Pour cela je récupère la première chaîne envoyée par le client.
Soit les Header Http soit la chaine "Nouveau Client: username" envoyé par le client java.
Seulement pour le moment je n'ai considéré que mon client Java donc tous les échanges se font avec des ObjectInputStream.
J'ai modifié le code pour tenir compte du butineur mais du coup cela ne marche qu'avec le butineur et bloquant pour le reste comme ci dessou
Voila un bout de mon thread serveur:
Dans le cas ci dessus, aucun problème pour le navigateur mais bloquage du client java sur le ObjectOutputStream oos = new ObjectOutputStream(os)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public void run() { is = connexion.getInputStream(); os = connexion.getOutputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(is)); PrintWriter out = new PrintWriter(os); String login= in.readLine(); if (login.startsWith("Nouveau client")) { //impossible ici de redéfinir les flux? ois= new ObjectInputStream(is); //Code bloquant ici. Pourtant j'ai besoin d'un Object Input stream :s oos = new ObjectOutputStream(os); username = login.substring(15); if (username.equalsIgnoreCase("anonyme")) { username+=numClient; System.out.println("Arrivee de " + username + "."); oos.writeObject("Connection acceptée"); oos.flush(); //suite du code et envoi/reception d'objet avec le client java } } //Si c'est un client HTTP else if (login.matches("GET \\w+")) { //dans ce cas ca marche puisque les flux BufferedReader et PrintWriter ont été définis en premier out.println("Bienvenue Client http"); //suite du code }
Si je défini les ObjectInput/OutputStreams en premier alors le client java passe
mais pas
Ma question est donc de savoir si il est possible d'utiliser plusieurs flux dans la même socket. Sinon est ce que je peux "fermer" un des flux et en réouvrir un autre?
J'ai essayé de manipuler les InputStream et OutputStream directement mais je n'ai pas réussi, même chose avec les DataInputStream
Merci
Partager