marsrepart
Messages postés18Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention23 janvier 2003
-
27 déc. 2002 à 22:43
marsrepart
Messages postés18Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention23 janvier 2003
-
2 janv. 2003 à 13:57
hello tout le monde.. je suis un newbies....
Voila, je dois faire un client/serveur (style FTP)java qui dialogue par le biais de socket (normal .. je sais)
le probleme vient à la compilation. le compilateur me dit que ma chaine de caractères ne sera jamais "atteinte"... est-ce que celà vient du fait que j'utilsie des flux d'ES et qu'il faut une temporisation ? ca j'en sais rien du tout, en tout k ,j'ai vraiment besoni d'aide....
merci à ceux qui tenteront de se pancher sur ce pas beau code (et aux autres aussi ;))
tchussssssss
import java.io.*;
import java.net.*;
public class Client extends Thread{
private Socket _sockClient;
private static int DEFAUT = 3000 ;
private DataOutputStream _dout ;
private DataInputStream _din ;
public Client (String machine, int port){
try{
_sockClient = new Socket(machine,port);
_dout = new DataOutputStream (_sockClient.getOutputStream());
_din = new DataInputStream (_sockClient.getInputStream());
}
catch (IOException e){
System.err.println(e);
try {_sockClient.close();}
catch (IOException ex){}
}
}
public String lectureClavier(){
BufferedReader fr = new BufferedReader(new InputStreamReader (System.in));
String reponse ="" ;
try {
reponse = fr.readLine();
}
catch (IOException e){
System.out.println("Erreur dans la lecture au clavier");
System.exit(1);
}
return reponse;
}
public static void main (String [] args){
if ((args.length>2) | (args.length==0)) {
System.out.println("Erreur dans les arguments du client");
System.exit(1);
}
int port ;
try {
port = Integer.parseInt(args[1]);
}
catch (NumberFormatException e){
port = DEFAUT;
}
Client c = new Client(args[0],port) ;
c.start();
}
}
A voir également:
Unreachable statement java
Java unreachable statement - Meilleures réponses
Unreachable statement in java - Meilleures réponses
JHelp
Messages postés261Date d'inscriptionjeudi 5 septembre 2002StatutMembreDernière intervention 6 octobre 200511 28 déc. 2002 à 08:25
Tu as oublier de mettre des {} pour ton for(;;)
ilfait donc indifiniment seulement la ligne qui suit et les autres ne seront jamais atteintes.
Regarde la correction si dessous.
Je voulais également te signaler que le ou logique en java c'est || et non |, le | et le ou binaire (bit à bit pour deux entiers)
JHelp
> hello tout le monde.. je suis un newbies....
> Voila, je dois faire un client/serveur (style FTP)java qui dialogue par le biais de socket (normal .. je sais)
> le probleme vient à la compilation. le compilateur me dit que ma chaine de caractères ne sera jamais "atteinte"... est-ce que celà vient du fait que j'utilsie des flux d'ES et qu'il faut une temporisation ? ca j'en sais rien du tout, en tout k ,j'ai vraiment besoni d'aide....
> merci à ceux qui tenteront de se pancher sur ce pas beau code (et aux autres aussi ;))
>
> tchussssssss
>
>
> import java.io.*;
> import java.net.*;
>
>
> public class Client extends Thread{
> private Socket _sockClient;
> private static int DEFAUT = 3000 ;
> private DataOutputStream _dout ;
> private DataInputStream _din ;
>
>
>
> public Client (String machine, int port){
> try{
> _sockClient = new Socket(machine,port);
> _dout = new DataOutputStream (_sockClient.getOutputStream());
> _din = new DataInputStream (_sockClient.getInputStream());
> }
> catch (IOException e){
> System.err.println(e);
> try {_sockClient.close();}
> catch (IOException ex){}
> }
>
> }
>
>
> public String lectureClavier(){
> BufferedReader fr = new BufferedReader(new InputStreamReader (System.in));
> String reponse ="" ;
> try {
> reponse = fr.readLine();
> }
> catch (IOException e){
> System.out.println("Erreur dans la lecture au clavier");
> System.exit(1);
> }
> return reponse;
> }
>
>
> public void run(){
> String reponse ="1";
> String sTemp="";
> boolean espace2 = false ;
> int j = 0 ;
> String requete ="";
> try{
>
> String s = lectureClavier();
> while ((!espace2) && j<s.length()){
>
> if (!s.substring(j,j+1).equals(" ")) {
> requete +=s.charAt(j);
> j++;
> }
> else espace2 = true;
> }
>
> // on vient de recuperer la commande de la requete
> // On va effectuer des tests
>
>
> System.out.println("la chaine de caractere rentree est : "+s);
> if (requete.equals("req")) {
> System.out.println("On a rentre la commande pwd");
> requete = 1+"";
> byte[] buffer= requete.getBytes();
> _dout.write(buffer,0,buffer.length);
> reponse = "";
> for(;;) {
> reponse += (char) _din.readByte();
> System.out.println(reponse);
> }
> //ch = reponse.charAt(0);
>
> //if (reponse.length()==0) sTemp="1";
> sTemp = reponse.substring(0,1); // <-- PROBLEME ICI
> if (!sTemp.equals("0")) System.out.println("Erreur dans la commande pwd");
> else {
> int i =2;
> int nbreCarac ;
> String temp =""+reponse.charAt(2);
> boolean espace = false ;
> while((i<(reponse.length()-8)) && (!espace)) {
> i++;
> if (reponse.substring(i,i+1).equals(" ")) espace = true;
> else temp += reponse.charAt(i);
> }
> nbreCarac = Integer.parseInt(temp);
> for (int k = 0 ;k<nbreCarac; k++)
> System.out.print((char) reponse.charAt(i+k+1));
> System.out.println();
> }
> }
> if (requete.equals("cd")) {
> System.out.println("On a rentre la commande cd");
> requete = 2 +" "+ (s.length()-3)+ " ";
> while (j<requete.length()) {
> requete += s.charAt(j);
> j++;
> }
> byte[] buffer = requete.getBytes();
> _dout.write(buffer,0,buffer.length);
> reponse ="";
> for (;;)
{
> reponse + = (char) _din.readByte();
> sTemp = reponse.substring(0,1); // <-- PROBLEME ICI
> if (sTemp.equals("1")) System.out.println("La commande cd a mal ete rentree");
> if (sTemp.equals("2")) System.out.println("L'operation n'est pas permise");
> if (sTemp.equals("3")) System.out.println("Le repertoire est inexistant");
> if (sTemp.equals("0")) {}
>
> }
>
> }
> catch (IOException e){
> System.err.println(e);
> try {_sockClient.close();}
> catch (IOException ex){}
> }
}
> }
>
>
>
>
>
>
> public static void main (String [] args){
> if ((args.length>2) | (args.length ==0)) {
> System.out.println("Erreur dans les arguments du client");
> System.exit(1);
> }
> int port ;
> try {
> port = Integer.parseInt(args[1]);
> }
> catch (NumberFormatException e){
> port = DEFAUT;
> }
> Client c = new Client(args[0],port) ;
> c.start();
> }
>
>
> }
>
>
>
>
>
>
marsrepart
Messages postés18Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention23 janvier 2003 28 déc. 2002 à 10:22
je ne suis pas sur que ce soit la bonne solution.
Je t'explique grosso-modo ce que je veux faire...
En fait, je vais recevoir une reponse de requete dans mon dataInputStream que je vais convertir en chaine de caractères pour pouvoir effectuer un test sur le 1er caractere.
Effectivememnt, je suppose que le probleme vient de cette boucle, moi je pensais que lorsqu'on allait arriver en fin de flux, on allait sortir grace a l'exception EOFException. Et d'ailleurs, dans mes tests,c a marche comme ca.... Par contre, le compilateur n'a pas l 'air d'aimer le fait que l'on sorte si brutalement
JHelp
Messages postés261Date d'inscriptionjeudi 5 septembre 2002StatutMembreDernière intervention 6 octobre 200511 28 déc. 2002 à 14:15
En effet, et les boucles infinie sont le plus souvent à éviter.
Et pourquoi, puisque que seul le premier caractère t'interres tu ferais pas :
switch((char) _din.readByte())
{
case '1' :
System.out.println("La commande cd a mal ete rentree");
break;
case '2' :
System.out.println("L'operation n'est pas permise");
break;
case '3' :
System.out.println("Le repertoire est inexistant");
break;
}
Ou si tu tiens absolument à récupérer tout le flux
int lu=-1;
do
{
lu = _din.readByte();
if(lu>=0)
reponse += (char) lu;
}while(lu>=0);
sTemp = reponse.substring(0,1);
if (sTemp.equals("1")) System.out.println("La commande cd a mal ete rentree");
if (sTemp.equals("2")) System.out.println("L'operation n'est pas permise");
if (sTemp.equals("3")) System.out.println("Le repertoire est inexistant");
if (sTemp.equals("0")) {}
JHelp
Vous n’avez pas trouvé la réponse que vous recherchez ?
marsrepart
Messages postés18Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention23 janvier 2003 28 déc. 2002 à 14:50
pas mal du tout... je suis preneur de la seconde solution ;) Je cherchais effectivement une solution du type numero 2, mais je n'arrivais pas à trouver des choses satisfaisantes.
Je vais appliquer ta seconde methode... et je reviendrais probablement t'embeter un peu beacoup .. ;)
merci beaucoup
bon boulot......
marsrepart
Messages postés18Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention23 janvier 2003 28 déc. 2002 à 18:18
j'ai un dernier probleme ....
j'ai utilise la 2 eme boucle decrite au dessus et ...
en fait , quand je fais un pritnln pour voir ce qu'il y a dedans, rien ne s'affiche....
import java.io.*;
import java.net.*;
public class Client extends Thread{
private Socket _sockClient;
private static int DEFAUT = 3000 ;
private DataOutputStream _dout ;
private DataInputStream _din ;
public Client (String machine, int port){
try{
_sockClient = new Socket(machine,port);
_dout = new DataOutputStream (_sockClient.getOutputStream());
_din = new DataInputStream (_sockClient.getInputStream());
}
catch (IOException e){
System.err.println(e);
try {_sockClient.close();}
catch (IOException ex){}
}
}
public String lectureClavier(){
BufferedReader fr = new BufferedReader(new InputStreamReader (System.in));
String reponse ="" ;
try {
reponse = fr.readLine();
}
catch (IOException e){
System.out.println("Erreur dans la lecture au clavier");
System.exit(1);
}
return reponse;
}
// on vient de recuperer la commande de la requete
// On va effectuer des tests
System.out.println("la chaine de caractere rentree est : "+s);
if (requete.equals("pwd")) {
System.out.println("On a rentre la commande pwd");
requete = 1+"";
byte[] buffer= requete.getBytes();
_dout.write(buffer,0,buffer.length);
reponse = "";
int lu=-1;
do
{
lu = _din.readByte();
if(lu>=0) reponse += (char) lu;
}while(lu>=0);
System.out.print("Affichage de la chaine de reponse : ");
for (int h = 0; h <reponse.length() ;h++)
System.out.print(reponse.charAt(h));
System.out.println();
sTemp = reponse.substring(0,1);
if (!sTemp.equals("0")) System.out.println("Erreur dans la commande pwd");
else {
int i =2;
int nbreCarac ;
String temp =""+reponse.charAt(2);
boolean espace = false ;
while((i<(reponse.length())) && (!espace)) {
i++;
if (reponse.substring(i,i+1).equals(" ")) espace = true;
else temp += reponse.charAt(i);
}
nbreCarac = Integer.parseInt(temp);
System.out.println("Voici la valeur de nbreCarac : "+nbreCarac);
for (int k = 0 ;k<nbreCarac; k++)
System.out.print((char) reponse.charAt(i+k+1));
System.out.println();
}
}
if (requete.equals("cd")) {
System.out.println("On a rentre la commande cd");
requete = 2 +" "+ (s.length()-3)+ " ";
System.out.print("impression de la requete : ");
while (j<requete.length()) {
requete += s.charAt(j);
j++;
System.out.print(s.charAt(j));
}
System.out.println();
byte[] buffer = requete.getBytes();
_dout.write(buffer,0,buffer.length);
int lu=-1;
do
{
lu = _din.readByte();
if(lu>=0) reponse += (char) lu;
}while(lu>=0);
sTemp = reponse.substring(0,1);
if (sTemp.equals("1")) System.out.println("La commande cd a mal ete rentree");
if (sTemp.equals("2")) System.out.println("L'operation n'est pas permise");
if (sTemp.equals("3")) System.out.println("Le repertoire est inexistant");
if (sTemp.equals("0")) System.out.println(s);
public static void main (String [] args){
if ((args.length>2) || (args.length==0)) {
System.out.println("Erreur dans les arguments du client");
System.exit(1);
}
int port ;
try {
port = Integer.parseInt(args[1]);
}
catch (NumberFormatException e){
port = DEFAUT;
}
Client c = new Client(args[0],port) ;
c.start();
}
marsrepart
Messages postés18Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention23 janvier 2003 29 déc. 2002 à 15:49
mea culpa... l'erreur ne vient pasde ta petite boucle mais d'ailleurs ..... hmm... je pars à la cherchure (euh.. cherchance on dit peut-etre) de ce petit insecte...
marsrepart
Messages postés18Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention23 janvier 2003 30 déc. 2002 à 14:02
euh g marque l'endroit qui me pose souci dans mon code....
En fait, quand je lis le flux, si j'affiche ce que je lis, ca s'affiche, masi quand je lis la variable ou j'ai copie le flux, y'a plus rien... Un veritable tour de magie.... Je suis sur que j 'ia fait une enorme boulette !!!!
PS : question subsidiaire ... Ce code correspond (on l'aura compris) à un client du type FTP, comment faire pour qu'après avoir recu une commande et l'avoir execute, je puisse renvoyer une nouvelle commande
Merci
.
.
.
.
public void run(){
String reponse ="";
String sTemp="";
boolean espace2 = false ;
int j = 0 ;
byte [] buffer; // conversion en bytes de la requete
String requete ="";
try{
String s = lectureClavier();
while ((!espace2) && j<s.length()){
// on vient de recuperer la commande de la requete
// On va effectuer des tests
System.out.println("la chaine de caractere rentree est : "+s);
if (requete.equals("pwd")) {
System.out.println("On a rentre la commande pwd");
requete = 1+"";
buffer= requete.getBytes();
_dout.write(buffer,0,buffer.length);
reponse = "";
int lu=-1;
System.out.print("affichage des valeurs de lu : ");
do
{
/********** LE SYSTEM.OUT.PRINTLN FONCTIONNE CI-DESSOUS *************************/
lu = _din.readByte();
System.out.print((char)lu+"");
if(lu>=0) reponse += (char) lu;
}while(lu>=0);
/*********** PARCONTRE CELUI EN DESSOUS NA PAS L'AIR DE FONCTIONNER ET A FORTIORI CEUX
QUI SONT UN PEUT PLUS BAS !!!! *********************************/
System.out.print("Affichage de la chaine de reponse : ");
for (int h = 0; h <reponse.length() ;h++)
System.out.print(reponse.charAt(h));
System.out.println();
sTemp = reponse.substring(0,1);
if (!sTemp.equals("0")) System.out.println("Erreur dans la commande pwd");
else {
int i =2;
int nbreCarac ;
String temp =""+reponse.charAt(2);
boolean espace = false ;
while((i<(reponse.length())) && (!espace)) {
i++;
if (reponse.substring(i,i+1).equals(" ")) espace = true;
else temp += reponse.charAt(i);
}
nbreCarac = Integer.parseInt(temp);
System.out.println("Voici la valeur de nbreCarac : "+nbreCarac);
for (int k = 0 ;k<nbreCarac; k++)
System.out.print((char) reponse.charAt(i+k+1));
System.out.println();
}
}
.
.
.
.
JHelp
Messages postés261Date d'inscriptionjeudi 5 septembre 2002StatutMembreDernière intervention 6 octobre 200511 31 déc. 2002 à 13:11
Oupsss.... :blush)
Honte à moi.
J'ai relu le code et je vois ce qui ne va pas.
J'ai fait une erreur de débutant.
En effet, tu fait _din.readByte(), donc tu lit un byte qui est comprit entre -127 et 128, et ma condition d'écriture, est >=0.
Pour se sortir de cette impasse je te propose la chose suivante : remplacer _din.readByte() par _din.read(), ainsi, çà marchera beaucop mieux.
JHelp
marsrepart
Messages postés18Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention23 janvier 2003 1 janv. 2003 à 14:46
il y a quelque chose qui m'echappe, j'ai essaye cette de remplacer la methode readByte() par la methode read(), et mon programme ne sort toujours pas de la boucle.. Quand je fais un println de ce que contient ma boucle, nulle part il y a un -1 qui vient se greffer... Pourtant, une fin de flux est bien symbolizee par un -1 dans la doc...
Voici copie du code de la boucle ....
do
{
lu = _din.read();
System.out.print(lu+" ");
if (lu!=-1) reponse += (char) lu;
} while(lu!=-1);
marsrepart
Messages postés18Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention23 janvier 2003 2 janv. 2003 à 12:27
euh... j'ai un souci si je close mon dout du serveur comme tu me le suggeres.... c pas un petit souci en plus....
en fait, il me deconnecte le client en me disant que le client a ferme son socket.
Si t'as -encore- une solution miracle....
te gene pas :)
JHelp
Messages postés261Date d'inscriptionjeudi 5 septembre 2002StatutMembreDernière intervention 6 octobre 200511 2 janv. 2003 à 13:50
Dans ce cas au lieu d'un close, envoie un caractère spécial, in diquant fin de flux pour l'instant et de l'autre coté tu le test pour la fin de boucle
JHelp