OVH Cloud OVH Cloud

Lire des données d'un Socket et y ecrire

2 réponses
Avatar
Thomas OZENNE
Bonjour, j'essaie de lire et ecrire des données sur un socket malheuresement
impossible de lire les données sans boucler a l infini, je ne comprend pas
vraiement pourquoi mais le read() ne renvoie vraissemblablement jamais -1
donc la boucle ne s'arrete pas,

si vous pouviez m'aider

Merci d'avance



import java.io.*;
import java.net.*;

public class NewsTest {
public static void main(String[] args) throws IOException {

Socket echoSocket = null;
PrintWriter out = null;
InputStreamReader in = null;

try {
echoSocket = new Socket("smtp.free.fr", 25);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new InputStreamReader(echoSocket.getInputStream());
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for "
+ "the connection to: taranis.");
System.exit(1);
}

BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));
String userInput= new String();
String output = new String();
int c =0;

while (userInput!="fin") {
while((c = in.read())!= -1)
{
System.out.print((char)c);
}
userInput = stdIn.readLine();
out.println(userInput);
System.out.println(userInput);
}


System.out.println("Fin");
out.close();
in.close();
stdIn.close();
echoSocket.close();
}
}

2 réponses

Avatar
julien
Bonjour, j'essaie de lire et ecrire des données sur un socket malheuresement
impossible de lire les données sans boucler a l infini, je ne comprend pas
vraiement pourquoi mais le read() ne renvoie vraissemblablement jamais -1
donc la boucle ne s'arrete pas,

si vous pouviez m'aider

Merci d'avance



import java.io.*;
import java.net.*;

public class NewsTest {
public static void main(String[] args) throws IOException {

Socket echoSocket = null;
PrintWriter out = null;
InputStreamReader in = null;

try {
echoSocket = new Socket("smtp.free.fr", 25);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new InputStreamReader(echoSocket.getInputStream());
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for "
+ "the connection to: taranis.");
System.exit(1);
}

BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));
String userInput= new String();
String output = new String();
int c =0;

while (userInput!="fin") {
while((c = in.read())!= -1)
{
System.out.print((char)c);
}
userInput = stdIn.readLine();
out.println(userInput);
System.out.println(userInput);
}


System.out.println("Fin");
out.close();
in.close();
stdIn.close();
echoSocket.close();
}
}


???

2 remarques :
- pour comparer des String, on utilise la méthode .equals ou
.equalsIgnoreCase pour ignorer la casse
- il faudrait plutôt faire du multithread ici car sinon je ne vois pas
comment on peut sortir de la 1ère boucle while

Avatar
obere
Salut,

Le read() ne retournera -1 que lorsque la socket sera fermee a l'autre
extremite de la connection.

Il faut donc que tu saches combien de caracteres tu dois lire sur la
socket (soit via un caractere de fin de transmission, soit via un
indicateur de longueur de transmission - nombre de caracteres envoyes).

Dans le cas du protocole SMTP (port 25), il me semble me rappeler que
chaque commande / code de retour renvoye par le serveur est termine par
une sequence <CRLF> (code Ascii 13, puis code Ascii 10). Verifie dans
la RFC.

Au lieu de verifier que le dernier caractere lu vaut -1, il faut donc
verifier que les deux derniers caracteres lus valent 13 et 10.

J'espere que ca t'aide. Hesites pas a demander + de details.