Socket java client serveur
Résolu/Fermé
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
-
9 mai 2012 à 23:41
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012 - 16 mai 2012 à 11:33
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012 - 16 mai 2012 à 11:33
A voir également:
- Socket java client serveur
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Changer serveur dns - Guide
- Formate pour taxer client frigo vide - Forum PDF
34 réponses
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
10 mai 2012 à 21:36
10 mai 2012 à 21:36
bon KX merci pour tout je pert espoir jai pas pu faire ce que je voulais le faite denvoyer un fichier avec jfilechooser et créer un dossier dune donnée de ma table sql
je voulais me basé sur le code que je tai envoyé parcequ'il enregistre le fichier et il créer un dossier mais il se bloque.
merci beaucoup KX.
je voulais me basé sur le code que je tai envoyé parcequ'il enregistre le fichier et il créer un dossier mais il se bloque.
merci beaucoup KX.
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
10 mai 2012 à 22:04
10 mai 2012 à 22:04
le serveur que vous mavez donné se déconect a chaque fois qu'il fai une action je ne sais pas pourquoi
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
10 mai 2012 à 22:41
10 mai 2012 à 22:41
Ce n'est pas le serveur qui se déconnecte, c'est le client. C'était pour faire un exemple simple.
Dans mes deux main, on voit bien ce qui se passe, je créé 3 clients chacun faisant une action, et dans la boucle for du serveur on attend ces 3 clients...
Dans mes deux main, on voit bien ce qui se passe, je créé 3 clients chacun faisant une action, et dans la boucle for du serveur on attend ces 3 clients...
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
11 mai 2012 à 01:06
11 mai 2012 à 01:06
Bonsoir KX jai réussi a créer un dossier et dans ce dossier un sous dossier le probléme c'est est ce qu'il ya un moyen d'envoyer des fichier evec jfilechooser utilisant objectoutputStream. Merci .
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
11 mai 2012 à 09:46
11 mai 2012 à 09:46
L'ObjectOutputStream c'est le Client qui doit le manipuler.
Si tu veux faire une action lié à un JFileChooser, tu dois créer un Client qui envoie le fichier puis s'arrête une fois l'action terminée pour libérer le Serveur.
Si tu veux faire une action lié à un JFileChooser, tu dois créer un Client qui envoie le fichier puis s'arrête une fois l'action terminée pour libérer le Serveur.
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
11 mai 2012 à 10:41
11 mai 2012 à 10:41
merci KX
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
11 mai 2012 à 10:41
11 mai 2012 à 10:41
et au niveau du serveur pour récupérer le fichier et le mettre dans un dossier ya un moyen ? merci
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
11 mai 2012 à 10:48
11 mai 2012 à 10:48
Bien sûr, dans mon code, cela correspond au mode 1, et aux méthodes envoiFichier, je ne l'ai pas implémenté, mais si tu te bases sur les méthodes creationDossier que j'ai fait en entier ça devrait aller.
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
11 mai 2012 à 11:06
11 mai 2012 à 11:06
merci KX parceque dans ce code ce qui me dérange c le fileinputstream moi je veux enregistrer le fichier dans un dossier précis et ça veux pas marcher
merci
-->> FileInputStream fis = new FileInputStream("t.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); int i = ois.readInt(); String today = (String) ois.readObject(); Date date = (Date) ois.readObject();
merci
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
11 mai 2012 à 11:08
11 mai 2012 à 11:08
j'ai remplacé le t.tmp par le chemin du dossier mais il me dise accés refusé
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
11 mai 2012 à 11:11
11 mai 2012 à 11:11
Les ObjectInputStream c'est pour la communication entre les sockets, pour la communication de fichier tu utilises un FileInputStream d'accord, mais mélanger les deux ça ne va plus !
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
11 mai 2012 à 11:17
11 mai 2012 à 11:17
mais il ya un message qui apparait il me dise comme quoi accés refusé au dossier voici mon code
Serveur
Client
merci KX
Serveur
server = new ServerSocket(1234); while ( true ) { connection = server.accept(); FileInputStream fis = new FileInputStream("c:\\dossier\\"); ObjectInputStream ois = new ObjectInputStream(fis); int i = ois.readInt(); if(i==1) { File today = (File) ois.readObject(); //Date date = (Date) ois.readObject(); } ois.close();
Client
JFileChooser selector = new JFileChooser(); selector.setDialogTitle("Selecciona el archivo a enviar"); int resultado = selector.showOpenDialog(null); if (resultado == JFileChooser.APPROVE_OPTION) { archivo = selector.getSelectedFile(); direccionArchivo = archivo.getPath().toString(); } else{via.close();} FileOutputStream fos = new FileOutputStream(direccionArchivo); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeInt(1); oos.writeObject(archivo.getName()); // oos.writeObject(new Date()); oos.close();
merci KX
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
11 mai 2012 à 12:01
11 mai 2012 à 12:01
Voici KX ce que tu ma demandé de faire jai suivi le méme principe que créerdossier
mais j'ai eu un message d'erreur
< java.util.regex.Pattern.SyntaxErrorException: llegal/unsuported escape sequence near index 3 c:\dossier\/gras>
voici le code
<gras>Serveur
Client
Merci beaucoup KX
mais j'ai eu un message d'erreur
< java.util.regex.Pattern.SyntaxErrorException: llegal/unsuported escape sequence near index 3 c:\dossier\/gras>
voici le code
<gras>Serveur
server = new ServerSocket(1234); while ( true ) { connection = server.accept(); ObjectInputStream input = new ObjectInputStream(connection.getInputStream()); int i = input.readInt(); String dir = input.readUTF(); String[] tab = dir.split("/c:\\dossier\\"); File parent = root; for (String child : tab) parent = new File(parent,child); input.close();
Client
JFileChooser selector = new JFileChooser(); selector.setDialogTitle("Selecciona el archivo a enviar"); int resultado = selector.showOpenDialog(null); if (resultado == JFileChooser.APPROVE_OPTION) { archivo = selector.getSelectedFile(); direccionArchivo = archivo.getPath().toString(); } else{via.close();} ObjectOutputStream output = new ObjectOutputStream(via.getOutputStream()); output.writeInt(3); output.writeUTF(archivo.getName()); output.flush();
Merci beaucoup KX
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
11 mai 2012 à 12:22
11 mai 2012 à 12:22
Le split prend en paramètre une expression régulière, je ne vois pas ce que viens faire "c:\\dossier\\" là dedans, l'expression que j'avais marqué : "/\\\\" n'était a priori pas à modifier...
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
11 mai 2012 à 12:29
11 mai 2012 à 12:29
et comme je vais faire pour spécifier le dossier ou va arriver le fichier?
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
11 mai 2012 à 12:35
11 mai 2012 à 12:35
Avec le string dir ça ira, celui-ci contient un chemin relatif (exemple : "toto/tata/titi.txt"), que le split("/\\\\") va décomposer en String[] { "toto", "tata", "titi.txt" }, de sorte que la petite boucle for permette de se déplacer de la racine (File root) et construire l'objet File correspondant.
Si C:\\dossier est ta racine alors il faut modifier File root = new File("C:\\dossier\\");
Si C:\\dossier est ta racine alors il faut modifier File root = new File("C:\\dossier\\");
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
11 mai 2012 à 13:03
11 mai 2012 à 13:03
merci KX pour ta réponse jai essayé mais ça na pas marché je ne reçois rien
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
11 mai 2012 à 13:05
11 mai 2012 à 13:05
j'ai mis ça au niveau du serveur
merci
String dir = input.readUTF(); File root = new File("C:\\dossier\\"); input.close();
merci
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
11 mai 2012 à 22:19
11 mai 2012 à 22:19
Bonsoir KX jai réussi a créer les dossier envoyer des fichier le probléme que j'ai c'est que il envoi un nombre de fichier apré un moment il se bloque et il me dise
java.net.SocketException:Connection reset by peer:Socket Write Error
voici le code
Client
Serveur
Merci beaucoup KX!
java.net.SocketException:Connection reset by peer:Socket Write Error
voici le code
Client
try { // IP = JOptionPane.showInputDialog(null,"Entrez Lip du pc distant","Cliente",JOptionPane.CANCEL_OPTION); Socket via = new Socket(IP, 1234); if(via.isConnected()) { JOptionPane.showMessageDialog(null, "Conectado al servidor: " + IP); JFileChooser selector = new JFileChooser(); selector.setDialogTitle("Selecciona el archivo a enviar"); int resultado = selector.showOpenDialog(null); if (resultado == JFileChooser.APPROVE_OPTION) { archivo = selector.getSelectedFile(); direccionArchivo = archivo.getPath().toString(); }else{via.close();} int i1=1; BufferedInputStream bis = new BufferedInputStream(new FileInputStream(direccionArchivo)); BufferedOutputStream bos = new BufferedOutputStream(via.getOutputStream()); //Enviamos el nombre del archivo DataOutputStream dos = new DataOutputStream(via.getOutputStream()); dos.writeUTF(archivo.getName()); dos.writeUTF(s); dos.writeUTF(s1); dos.writeInt(i1); byteArray = new byte[8192]; while ((in = bis.read(byteArray)) != -1) { bos.write(byteArray,0,in); } bis.close(); bos.close(); dos.close();
Serveur
try{ server = new ServerSocket(1234); while ( true ) { connection = server.accept(); receivedData = new byte[8192]; bis = new BufferedInputStream(connection.getInputStream()); DataInputStream dis = new DataInputStream(connection.getInputStream()); //recibimos el nombre del fichero file = dis.readUTF(); file1 = dis.readUTF(); file2=dis.readUTF(); int i=dis.readInt(); file = file.substring(file.indexOf('\\')+1,file.length()); if(i==1) { //aqui se escribe el archivo en la ubicacion donde este el Servidor.jar bos = new BufferedOutputStream(new FileOutputStream("C:\\ireg\\"+file1+"\\"+file2+"\\"+ file)); while ((in = bis.read(receivedData)) != -1){ bos.write(receivedData,0,in); bos.close(); }}else{System.exit(0);} dis.close(); bis.close();
Merci beaucoup KX!
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
12 mai 2012 à 14:58
12 mai 2012 à 14:58
C'est exaspérant de voir que tu ne réutilises pas du tout le code que j'ai pu te donner (et qui marche), parce que tu préfères reprendre ton code bogué et le modifié sur le tas en espérant qu'à un moment il y aura un miracle et que tout rentrera dans l'ordre !
Il me semble bien avoir dit (ici) qu'il ne fallait pas fermer la socket, or toi qu'est-ce que tu fais ?
De plus, avec ta manie de tout fermer j'imagine que ce genre de code va pas faire ce que tu veux pour des fichiers plus grand que la taille de ton buffer :
Il me semble bien avoir dit (ici) qu'il ne fallait pas fermer la socket, or toi qu'est-ce que tu fais ?
dis.close(); bis.close();
De plus, avec ta manie de tout fermer j'imagine que ce genre de code va pas faire ce que tu veux pour des fichiers plus grand que la taille de ton buffer :
while ((in = bis.read(receivedData)) != -1){
bos.write(receivedData,0,in);
bos.close();
}
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
12 mai 2012 à 15:07
12 mai 2012 à 15:07
Bonjour KX merci pour ta réponse je me suis basé sur ton serveur et j'ai fai ce serveur le voilà il marche trés bien avec un seul client mais quand un nouveau utilisateur s'ajoute les fichier n'arrive plus et il se plante voici le code merci.
Serveur
Serveur
public class Servidor implements Runnable { ServerSocket server; Socket connection; DataOutputStream output; BufferedInputStream bis; BufferedOutputStream bos; byte receivedData[]; int in; String file; String file1; String file2; public Servidor() { connection = null; try { server = new ServerSocket(1234); System.out.println("serveur"); } catch(Exception e) { System.out.println((new StringBuilder("erreur serveurn")).append(e).toString()); System.exit(1); } } public void run() { Socket client = null; do { do { if(server == null) { return; } try { client = server.accept(); System.out.println("nouveau client"); } catch(IOException e) { System.err.println((new StringBuilder("connexion impossible")).append(e.getMessage()).toString()); } } while(server == null); try { InputStream in = client.getInputStream(); DataInputStream dis = new DataInputStream(client.getInputStream()); file = dis.readUTF(); file1 = dis.readUTF(); file2=dis.readUTF(); int i=dis.readInt(); if(i==1) { File directorio = new File("c:\\dossier\\"+file1+"\\"+file2+"\\"); directorio.mkdir(); } if(file != null) { bos = new BufferedOutputStream(new FileOutputStream("C:\\dossier\\"+file1+"\\"+file2+"\\"+ file)); byte buf[] = new byte[1024]; int len; while((len = in.read(buf)) > 0) { bos.write(buf, 0, len); } // in.close(); bos.close(); } } catch(IOException e) { System.out.println((new StringBuilder("Error: ")).append(e).toString()); } } while(true); } public static void main(String a[]) { Servidor servidor = new Servidor(); (new Thread(servidor)).start(); } }
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
12 mai 2012 à 19:32
12 mai 2012 à 19:32
Je ne vois vraiment pas en quoi ce programme est basé sur le mien !
En tout cas, au niveau de la manière de programmer tu en es très loin, te revoilà avec un code monolithique mélangeant tout au même endroit, très difficile à lire et donc à déboguer !
Ce que tu fais c'est une classe implements Runnable, et ensuite un new Thread(serveur), mais cela ne créé qu'un seul thread ! Si tu veux que ton serveur créé un nouveau thread à chaque nouveau client, alors le nouveau thread doit intervenir après le client = server.accept(); de sorte que le thread principal revienne immédiatement sur cette instruction pour accepter les clients suivants...
En tout cas, au niveau de la manière de programmer tu en es très loin, te revoilà avec un code monolithique mélangeant tout au même endroit, très difficile à lire et donc à déboguer !
Ce que tu fais c'est une classe implements Runnable, et ensuite un new Thread(serveur), mais cela ne créé qu'un seul thread ! Si tu veux que ton serveur créé un nouveau thread à chaque nouveau client, alors le nouveau thread doit intervenir après le client = server.accept(); de sorte que le thread principal revienne immédiatement sur cette instruction pour accepter les clients suivants...
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
12 mai 2012 à 22:39
12 mai 2012 à 22:39
Bonsoir KX merci de m'aider j'ai fais un serveur presque comme celui que vous maviez donner le probléme c'est qu'il marche 3fois et avec un seul clientquand il ya un autre client qui arrive il plante voici le code merci beaucoups.
Serveur
merci beaucoup.
Serveur
public class bokal { private final ServerSocket srv; private final File root; String file ; String file1 ; String file2 ; InputStream in ; DataInputStream dis; public bokal(File root, int port) throws IOException { srv = new ServerSocket(port); this.root = root; } public void close() throws IOException { srv.close(); } public void service() throws IOException { Socket clt = srv.accept(); if(srv == null) { return; } in = clt.getInputStream(); dis = new DataInputStream(clt.getInputStream()); file = dis.readUTF(); file1 = dis.readUTF(); file2 = dis.readUTF(); int i=dis.readInt(); if(i==1) {creationDossier(in); } if(file != null) { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\IREG\\"+file1+"\\"+file2+"\\"+ file)); byte buf[] = new byte[1024]; int len; while((len = in.read(buf)) > 0) { bos.write(buf, 0, len); } in.close(); } } public boolean envoiFichier(ObjectInputStream input, ObjectOutputStream output) throws IOException { //TODO // envoiConfirmation(output,false,"Mode non implémenté."); return false; } public boolean receptionFichier(InputStream in) throws IOException { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\dossier\\"+file1+"\\"+file2+"\\"+ file)); byte buf[] = new byte[1024]; int len; while((len = in.read(buf)) > 0) { bos.write(buf, 0, len); } return false; } public boolean creationDossier(InputStream in) throws IOException { File directorio = new File("c:\\dossier\\"+file1+"\\"+file2+"\\"); directorio.mkdirs(); // envoiConfirmation(output,false,e.toString()); return false; } public static void main(String...args) throws IOException { bokal s = new bokal(new File(""),1234); for (int i=1; i<=3; i++) s.service(); // s.close(); } }
merci beaucoup.
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
12 mai 2012 à 22:40
12 mai 2012 à 22:40
je n'ai pas utilisé objectoutputstream parceque je n'ai pas su comment envoyer les fichier merci
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
12 mai 2012 à 22:49
12 mai 2012 à 22:49
Il marche trois fois parce que dans le main il y a une boucle for qui fait 3 fois appel à service()
Il vaudrait mieux faire une boucle while(true). Cependant, mon code ne permettait pas de gérer plusieurs services en même temps, il faisait des services courts puisque chaque opération était créée par un client "différent".
Si tu veux faire un serveur véritablement multi-thread il faudra faire un peu différemment, je pense à quelque chose comme ça (je reprends mon code, mais j'ai pas testé) :
Il vaudrait mieux faire une boucle while(true). Cependant, mon code ne permettait pas de gérer plusieurs services en même temps, il faisait des services courts puisque chaque opération était créée par un client "différent".
Si tu veux faire un serveur véritablement multi-thread il faudra faire un peu différemment, je pense à quelque chose comme ça (je reprends mon code, mais j'ai pas testé) :
public void service() throws IOException { while (true) { final Socket clt = srv.accept(); new Thread() { @Override public void run() { ObjectOutputStream output = new ObjectOutputStream(clt.getOutputStream()); ObjectInputStream input = new ObjectInputStream(clt.getInputStream()); int mode = input.readInt(); switch (mode) { case 1 : envoiFichier(input,output); break; case 2 : receptionFichier(input,output); break; case 3 : creationDossier(input,output); break; default : envoiConfirmation(output,false,"Mode non reconnu."); } input.close(); output.close(); }.start(); } }
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
12 mai 2012 à 23:18
12 mai 2012 à 23:18
Merci KX pour ta réponse ça me donne erreur a ce niveau
merci beaucoups.
public class bokal { private final ServerSocket srv; private final File root; String file ; String file1 ; String file2 ; InputStream in ; DataInputStream dis; public bokal(File root, int port) throws IOException { srv = new ServerSocket(port); this.root = root; } public void close() throws IOException { srv.close(); } public void service() throws IOException {while(true) { final Socket clt = srv.accept(); new Thread() { @Override public void run() { if(srv == null) { return; } in = clt.getInputStream(); dis = new DataInputStream(clt.getInputStream()); file = dis.readUTF(); file1 = dis.readUTF(); file2 = dis.readUTF(); int i=dis.readInt(); if(i==1) {creationDossier(in); } if(file != null) { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\IREG\\"+file1+"\\"+file2+"\\"+ file)); byte buf[] = new byte[1024]; int len; while((len = in.read(buf)) > 0) { bos.write(buf, 0, len); } } in.close(); ----------->>> } }.start(); }
merci beaucoups.
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
12 mai 2012 à 23:28
12 mai 2012 à 23:28
Ce serait bien de dire c'est quoi comme erreur !
Là comme ça je ne vois pas ce qui coince, toutes les accolades et parenthèses sont bien fermées.
Là comme ça je ne vois pas ce qui coince, toutes les accolades et parenthèses sont bien fermées.
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
12 mai 2012 à 23:32
12 mai 2012 à 23:32
il disent comme quoi il manque un point virgule mais ils sont tous bien mis en place :s
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
12 mai 2012 à 23:43
12 mai 2012 à 23:43
Il te manque deux accolades à la fin pour fermer la méthode service() et la classe bokal, c'est peut-être juste une erreur de copier-coller sur le forum, mais ce serait bien de vérifier.
Plus embêtant, tu n'as aucun try/catch sur tes IOException, alors que la méthode run de Thread ne peut propager aucune exception !
Plus embêtant, tu n'as aucun try/catch sur tes IOException, alors que la méthode run de Thread ne peut propager aucune exception !
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
13 mai 2012 à 00:28
13 mai 2012 à 00:28
merci KX pour ta réponse.
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
13 mai 2012 à 17:13
13 mai 2012 à 17:13
bonjour KX je voulais savoir pour les serveur multithread est ce que le jdk doit etre le meme sur tout les pc parceque ca marche d'un pc vers le serveur mais pour un autre pc ca bloque une fois jai changer le jdk ça a bloqué pour tous les deux merci.
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
13 mai 2012 à 20:52
13 mai 2012 à 20:52
Bonjour KX jenvoi un entier pour qu'il active la suppresion mais ca marche pas voici mon code
Serveur
Merci beaucoups.
Serveur
< public void supprimer(DataInputStream dis) { File directorio = new File("C:\\Idossier\\"+file1+"\\"+file2+"\\"+ file); directorio.delete(); } public void run() { String message = ""; // déclaration de la variable qui recevra les messages du client // on indique dans la console la connection d'un nouveau client System.out.println("Un nouveau client s'est connecte, no "+_numClient); try { InputStream in =_s.getInputStream(); DataInputStream dis = new DataInputStream(_s.getInputStream()); file = dis.readUTF(); file1 = dis.readUTF(); file2 = dis.readUTF(); i=dis.readInt(); switch (i) { case 2 : supprimer(dis); break; } /code> Client <code>public void supprimer() { int in; String direccionArchivo = null; String IP = "127.0.0.1"; int i=0; try { Socket via = new Socket(IP, 1234); if(via.isConnected()) { JOptionPane.showMessageDialog(null, "Conectado al servidor: " + IP); //Enviamos el nombre del archivo DataOutputStream dos = new DataOutputStream(via.getOutputStream()); dos.writeUTF(s); dos.writeUTF(s1); dos.writeInt(2); } }catch (Exception e) {//JOptionPane.showMessageDialog(null,e,"Error",JOptionPane.ERROR_MESSAGE); } }
Merci beaucoups.
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié par KX le 13/05/2012 à 22:52
Modifié par KX le 13/05/2012 à 22:52
Je ne sais pas si tu as regardé la documentation de delete(), mais le dossier doit être vide pour pouvoir être effacé, ce qui pourrait expliquer pourquoi cela ne fonctionne pas.
Une autre chose marqué dans la javadoc c'est que l'on peut utiliser la méthode de la classe Files pour avoir des informations plus précises lorsque la suppression a échouée, via différentes Exceptions qu'il faudra distinguer pour savoir quoi faire dans tel ou tel cas...
Attention : la classe Files et les exceptions associées sont nouvelles de la JDK 7, tu ne pourras donc pas diminuer la version pour la compatibilité des anciennes JRE comme on a pu le faire tout à l'heure...
Une autre chose marqué dans la javadoc c'est que l'on peut utiliser la méthode de la classe Files pour avoir des informations plus précises lorsque la suppression a échouée, via différentes Exceptions qu'il faudra distinguer pour savoir quoi faire dans tel ou tel cas...
Attention : la classe Files et les exceptions associées sont nouvelles de la JDK 7, tu ne pourras donc pas diminuer la version pour la compatibilité des anciennes JRE comme on a pu le faire tout à l'heure...
public static boolean delete(File toDelete) { try { java.nio.file.Files.delete(toDelete.toPath()); return true; } catch (java.nio.file.NoSuchFileException e) { System.err.println(e); return true; } catch (java.nio.file.DirectoryNotEmptyException e) { System.err.println(e); return false; } catch (IOException e) { System.err.println(e); return false; } catch (SecurityException e) { System.err.println(e); return false; } catch (Exception e) { System.err.println(e); return false; } }
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
14 mai 2012 à 00:15
14 mai 2012 à 00:15
merci KX voila jai réussi à supprimer le dossier méme avec les fichier mais le probléme c'est qui n'effectue pas la condition pour appelé la fonction.
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
14 mai 2012 à 00:25
14 mai 2012 à 00:25
"la condition pour appelé la fonction", quelle condition ? quel appel ? quelle fonction ?
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
14 mai 2012 à 10:40
14 mai 2012 à 10:40
Bonjour KX la condition du swith ici sur le serveur
Serveur
quand il reçoit 2 il neffectue pas l'opération merci.
Serveur
public void supprimer(DataInputStream dis) { File directorio = new File("C:\\Idossier\\"+file1+"\\"+file2+"\\"+ file); directorio.delete(); } public void run() { String message = ""; // déclaration de la variable qui recevra les messages du client // on indique dans la console la connection d'un nouveau client System.out.println("Un nouveau client s'est connecte, no "+_numClient); try { InputStream in =_s.getInputStream(); DataInputStream dis = new DataInputStream(_s.getInputStream()); file = dis.readUTF(); file1 = dis.readUTF(); file2 = dis.readUTF(); i=dis.readInt(); switch (i) { case 2 : supprimer(dis); break; }
quand il reçoit 2 il neffectue pas l'opération merci.
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
14 mai 2012 à 11:35
14 mai 2012 à 11:35
Essaye comme ceci (au moins le temps de déboguer)
public void supprimer() { File directorio = new File("C:\\Idossier\\"+file1+"\\"+file2+"\\"+ file); System.out.println(directorio.getAbsolutePath()); boolean b = delete(directorio); // la méthode delete que j'ai définie ici System.out.println(b); } public void run() { String message = ""; // un StringBuffer ce serait mieux non ? // on indique dans la console la connexion d'un nouveau client System.out.println("Un nouveau client s'est connecte, no "+_numClient); try { InputStream in = _s.getInputStream(); // un nom de variable ne devrait pas commencer par _ DataInputStream dis = new DataInputStream(_s.getInputStream()); file = dis.readUTF(); file1 = dis.readUTF(); file2 = dis.readUTF(); i=dis.readInt(); System.out.println(i); switch (i) { case 2 : supprimer(); // inutile de passer dis en paramètre, il n'est pas utilisé break; }
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
14 mai 2012 à 17:11
14 mai 2012 à 17:11
merci KX j'ai un autre soucis les fichiers excel arrive deformé quand je les ouvres je trouves des codes .
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié par KX le 14/05/2012 à 18:06
Modifié par KX le 14/05/2012 à 18:06
"je trouves des codes", mais encore ?
Un des problème possible d'une mauvaise transmission c'est l'encodage, tu utilises des readUTF et writeUTF qui sont a-priori des méthodes pour manipuler du texte, alors qu'un fichier Excel est un fichier binaire, il vaudrait donc mieux utiliser les méthode read(byte[]) et write(byte[])...
Un des problème possible d'une mauvaise transmission c'est l'encodage, tu utilises des readUTF et writeUTF qui sont a-priori des méthodes pour manipuler du texte, alors qu'un fichier Excel est un fichier binaire, il vaudrait donc mieux utiliser les méthode read(byte[]) et write(byte[])...
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
14 mai 2012 à 18:11
14 mai 2012 à 18:11
je supose que c'est un probléme du a lenvoi du fichier et a la récéption voici le serveur et le client merci beaucoup.
Serveur
Client
merci beaucoups.
Serveur
public void run() { try { InputStream in = socket.getInputStream(); DataInputStream dis = new DataInputStream(socket.getInputStream()); String file = dis.readUTF(); String file1 = dis.readUTF(); String file2 = dis.readUTF(); int i = dis.readInt(); if(i == 1) { File directorio = new File("c:\\dossier\\"+file1+"\\"+file2+"\\"); directorio.mkdirs(); } if(file != null) { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Idossier\\"+file1+"\\"+file2+"\\"+ file)); byte buf[] = new byte[131072]; int len; while((len = in.read(buf)) > 0 ) { bos.write(buf, 0, len); } } }
Client
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(direccionArchivo)); BufferedOutputStream bos = new BufferedOutputStream(via.getOutputStream()); //Enviamos el nombre del archivo DataOutputStream dos = new DataOutputStream(via.getOutputStream()); dos.writeUTF(archivo.getName()); dos.writeUTF(s); dos.writeUTF(s1); dos.writeInt(1); // dos.writeInt(2); byteArray = new byte[131072]; while ((in = bis.read(byteArray)) != -1) { bos.write(byteArray,0,in); }
merci beaucoups.
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
14 mai 2012 à 18:43
14 mai 2012 à 18:43
Comme ça je vois deux "détails" qui pourraient poser problème.
Dans Serveur, ta boucle while continue tant que len>0, or il est possible qu'à un moment donné on n'envoie rien (parce que le réseau est saturé par exemple) donc on a len==0, mais qu'à l'étape d'après on puisse continuer malgré tout l'envoi de données, or tu auras coupé ta boucle trop tôt et tu n'auras pas la fin du message ! Seul le cas len == -1 permet de s'assurer que la transmission est terminée.
Dans les deux codes, tu utilises 128 Kio pour ton buffer de données, je me demande si ce n'est pas un peu trop (surtout combiné à la première erreur), il faudrait que tu prennes une taille beaucoup plus modeste (1Kio suffira) pour vérifier que ce n'est pas cette taille qui pose problème...
Dans Serveur, ta boucle while continue tant que len>0, or il est possible qu'à un moment donné on n'envoie rien (parce que le réseau est saturé par exemple) donc on a len==0, mais qu'à l'étape d'après on puisse continuer malgré tout l'envoi de données, or tu auras coupé ta boucle trop tôt et tu n'auras pas la fin du message ! Seul le cas len == -1 permet de s'assurer que la transmission est terminée.
Dans les deux codes, tu utilises 128 Kio pour ton buffer de données, je me demande si ce n'est pas un peu trop (surtout combiné à la première erreur), il faudrait que tu prennes une taille beaucoup plus modeste (1Kio suffira) pour vérifier que ce n'est pas cette taille qui pose problème...
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
16 mai 2012 à 00:24
16 mai 2012 à 00:24
Bonsoir KX voila j'ai essayé mais rien voici mon code merci
Serveur
Client
merci beaucoups.
Serveur
public void run() { try { BufferedInputStream bis = new BufferedInputStream(_s.getInputStream()); DataInputStream dis = new DataInputStream(_s.getInputStream()); int i=dis.readInt(); file = dis.readUTF(); file1 = dis.readUTF(); file2 = dis.readUTF(); File directorio = new File("c:\\IREG\\"+file1+"\\"+file2+"\\"); directorio.mkdirs(); // File directorio = new File("c:\\ireg\\"+file1+"\\"+file2+"\\"); // directorio.delete(); switch(i){ case 1 : File directorio1 = new File("C:\\dossier\\"+file1+"\\"+file2+"\\"); SupprRep(directorio1); break; case 2 : creerdossier(file,file1,file2); break; } // File directorio = new File("c:\\dossier\\"+file1+"\\"+file2+"\\"); // directorio.delete();} if(file != null) { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\dossier\\"+file1+"\\"+file2+"\\"+ file)); byte buf[] = new byte[1024]; int len; while((len = bis.read(buf))>=0) { bos.write(buf, 0, len); } bis.close(); bos.close(); } }
Client
public void Client() { String IP = null; int i=0; try { IP = JOptionPane.showInputDialog(null,"Entrez Lip du pc distant","Client",JOptionPane.CANCEL_OPTION); Socket via = new Socket(IP, 1234); if(via.isConnected()) { JOptionPane.showMessageDialog(null, "Conectado al servidor: " + IP); //Enviamos el nombre del archivo DataOutputStream dos = new DataOutputStream(via.getOutputStream()); // dos.writeUTF(archivo.getName()); dos.writeUTF(s); dos.writeUTF(s1); dos.writeInt(2); // dos.writeInt(1); } via.close();
merci beaucoups.
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
16 mai 2012 à 00:26
16 mai 2012 à 00:26
et si j'écris le code avec le jfilechooser le int passe et la commande est executé sur le serveur je ne sais pas pourquoi merci.
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
16 mai 2012 à 01:57
16 mai 2012 à 01:57
c'est bon KX merci j'ai régler le probléme , il me reste un seul soucis c'est appelé une fonction qui se trouve dans une autre classe et l'utiliser dans la classe que je veux y'a t'il un moyen? merci
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
16 mai 2012 à 09:10
16 mai 2012 à 09:10
Si la méthode est public, il suffit de créer un objet de cette classe et de l'appeller, si la méthode est static c'est encore plus simple, on n'a pas besoin de créer l'objet !
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
16 mai 2012 à 11:33
16 mai 2012 à 11:33
Merci KX ça marche trés bien !
valour1234
Messages postés
67
Date d'inscription
mardi 8 mai 2012
Statut
Membre
Dernière intervention
18 mai 2012
16 mai 2012 à 11:33
16 mai 2012 à 11:33
merci pour ton aide!