Envoi des fichiers par des sockets java
Résolu/Fermé
tissouassoum
-
23 août 2011 à 00:31
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 30 juin 2015 à 07:01
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 30 juin 2015 à 07:01
A voir également:
- Envoi des fichiers par des sockets java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Renommer des fichiers en masse - Guide
- Java apk - Télécharger - Langages
- Wetransfer gratuit fichiers lourd - Guide
6 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
23 août 2011 à 10:32
23 août 2011 à 10:32
Bon j'ai regardé ton code, le moins qu'on puisse dire c'est que tu te compliques la vie !
En particulier, pourquoi as-tu besoin d'ouvrir autant de flux ?
Voici le coeur du programme, tu vas voir qu'en fait c'est très simple !
En particulier, pourquoi as-tu besoin d'ouvrir autant de flux ?
Voici le coeur du programme, tu vas voir qu'en fait c'est très simple !
public class Commun { public static void transfert(InputStream in, OutputStream out, boolean closeOnExit) throws IOException { byte buf[] = new byte[1024]; int n; while((n=in.read(buf))!=-1) out.write(buf,0,n); if (closeOnExit) { in.close(); out.close(); } } } public class Client { public static void main(String...args) throws IOException { Socket sock = new Socket(InetAddress.getLocalHost(),9001); Commun.transfert( new FileInputStream("D:\\test.jpg"), sock.getOutputStream(), true); sock.close(); } } public class Serveur { public static void main(String...args) throws IOException { Socket sock = new ServerSocket(9001).accept(); Commun.transfert( sock.getInputStream(), new FileOutputStream("D:\\test2.jpg"), true); sock.close(); } }
Fallentree
Messages postés
2309
Date d'inscription
mercredi 25 février 2009
Statut
Membre
Dernière intervention
22 juillet 2019
209
Modifié par Fallentree le 23/08/2011 à 00:45
Modifié par Fallentree le 23/08/2011 à 00:45
t es sur qu il faut pas passer tes buffers en hexa ???
Et ta boucle d'arret doit se faire avec un code d'echappement, si mes souvenirs sont bon.
Par exemple un buffer d'une certaine taille avec des carracteres a la manque dedans ...
tu peux aussi rajouter un correcteur d erreur sur ta trame comme une somme que tu envoies soit à la fin soit comme nouvelle trame ...
Differents modèles de protocoles te permettent de jongler sur ces echanges ...
par exemple, renvoie de la trame si elle est fausse ou intercepté ...
Et ta boucle d'arret doit se faire avec un code d'echappement, si mes souvenirs sont bon.
Par exemple un buffer d'une certaine taille avec des carracteres a la manque dedans ...
tu peux aussi rajouter un correcteur d erreur sur ta trame comme une somme que tu envoies soit à la fin soit comme nouvelle trame ...
Differents modèles de protocoles te permettent de jongler sur ces echanges ...
par exemple, renvoie de la trame si elle est fausse ou intercepté ...
ce sujet date, juste pour ajouter pour ceux qui cherchent:
La fonction transfert bug parfois en fonction des extensions, et la boucle ne donne jamais comme résultat -1... mieux vaut utiliser:
La fonction transfert bug parfois en fonction des extensions, et la boucle ne donne jamais comme résultat -1... mieux vaut utiliser:
public static void transfert(InputStream in, OutputStream out, boolean closeOnExit) throws IOException { byte buf[] = new byte[1024]; int n; while((n=in.read(buf))==1024){ out.write(buf,0,n); } //et la on ajoute les bytes plus petits que 1024 ) la fin out.write(buf,0,n); if (closeOnExit) { in.close(); out.close(); } }
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 2/01/2015 à 17:37
Modifié par KX le 2/01/2015 à 17:37
Bonjour,
Tu pars du principe que si la lecture ne renvoit pas 1024 alors c'est la fin. Or il peut y avoir moins de 1024 octets une fois, voire même 0, et pourtant la lecture n'est pas terminée. Cela peut venir d'une latence sur le réseau (ce qui se passerait par exemple si tu téléchargeais un fichier sur internet) ou alors d'une attente à l'autre bout du canal de communication.
Le seul moyen de garantir que la communication est vraiment terminée c'est le -1 (c'est écrit dans la documentation de la méthode read), si tu n'as jamais -1 c'est parce que le flux est resté ouvert du côté de l'écriture. Typiquement si tu lis directement sur System.in, le flux du clavier, celui-ci ne se ferme jamais tout seul, et tu pourrais le lire indéfiniment sans avoir de -1, et lorsque plus rien n'est écrit, tu as 0 octets lus pendant longtemps, mais dès que retapes à nouveau sur le clavier, tu recommences à lire des données...
PS. J'ai modifié ton message pour rajouter les balises de codes : <code java></code>
Tu pars du principe que si la lecture ne renvoit pas 1024 alors c'est la fin. Or il peut y avoir moins de 1024 octets une fois, voire même 0, et pourtant la lecture n'est pas terminée. Cela peut venir d'une latence sur le réseau (ce qui se passerait par exemple si tu téléchargeais un fichier sur internet) ou alors d'une attente à l'autre bout du canal de communication.
Le seul moyen de garantir que la communication est vraiment terminée c'est le -1 (c'est écrit dans la documentation de la méthode read), si tu n'as jamais -1 c'est parce que le flux est resté ouvert du côté de l'écriture. Typiquement si tu lis directement sur System.in, le flux du clavier, celui-ci ne se ferme jamais tout seul, et tu pourrais le lire indéfiniment sans avoir de -1, et lorsque plus rien n'est écrit, tu as 0 octets lus pendant longtemps, mais dès que retapes à nouveau sur le clavier, tu recommences à lire des données...
PS. J'ai modifié ton message pour rajouter les balises de codes : <code java></code>
et la class Commun on en fait quoi ?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
25 févr. 2015 à 10:55
25 févr. 2015 à 10:55
Bonjour,
C'est quoi ton problème avec la classe Commun ?
C'est quoi ton problème avec la classe Commun ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
Modifié le 4 mai 2023 à 10:34
Modifié le 4 mai 2023 à 10:34
Bonjour...
Bien que ce sujet doive être enterré... pour ceux qui cherchaient (comme moi) à transférer un fichier d'un client au serveur, qui le retransmettait à un client, sans fermer des sockets, je me suis contenté d'un code comme ça:
Client envoyeur:
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; public class Transfert { public static void transfert(InputStream in, OutputStream out) throws IOException { byte buf[] = new byte[1024]; int n; while((n=in.read(buf))!=-1){ out.write(buf,0,n); } PrintWriter outp = new PrintWriter(out); outp.println("!§#%%123{#done#}123%%#§!"); outp.flush(); } }
Serveur:
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; public class Transfert { public static void transfert(InputStream in, OutputStream out){ byte buf[] = new byte[1024]; int n; try { boolean cont = true; while(cont){ n = in.read(buf); out.write(buf,0,n); if(isEndReached(buf)){ cont = false; } } PrintWriter outp = new PrintWriter(out); outp.println("!§#%%123{#done#}123%%#§!"); outp.flush(); } catch (IOException e) { e.printStackTrace(); } } private static String GetString(byte[] bytes){ return new String(bytes); } private static boolean isEndReached(byte[] buf){ if(GetString(buf).contains("!§#%%123{#done#}123%%#§!")){ return true; } return false; } }
Le client recepteur:
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class Transfert { public static void transfert(InputStream in, OutputStream out){ byte buf[] = new byte[1024]; int n; try { boolean cont = true; while(cont){ n = in.read(buf); out.write(buf,0,n); if(isEndReached(buf)){ cont = false; } } } catch (IOException e) { e.printStackTrace(); } } static String GetString(byte[] bytes){ return new String(bytes); } public static boolean isEndReached(byte[] buf){ if(GetString(buf).contains("!§#%%123{#done#}123%%#§!")){ return true; } return false; } }
Beaucoup trouverons à redire de ce code, mais il remplit parfaitement sa fonction :)
pipo91
Messages postés
5
Date d'inscription
dimanche 29 septembre 2013
Statut
Membre
Dernière intervention
30 juin 2015
30 juin 2015 à 06:21
30 juin 2015 à 06:21
Salut ! Omment est ce qu'on doit proceder s'il ya plusieur client et qu'on veut envoyer le fichier a un client precis ?
Merci
Merci
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
>
pipo91
Messages postés
5
Date d'inscription
dimanche 29 septembre 2013
Statut
Membre
Dernière intervention
30 juin 2015
30 juin 2015 à 07:01
30 juin 2015 à 07:01
Bonjour,
Soit le "client" récepteur utilise le code du serveur pour obtenir le fichier.
Soit le serveur stocke le fichier envoyé avant de le transférer.
Soit le "client" récepteur utilise le code du serveur pour obtenir le fichier.
Soit le serveur stocke le fichier envoyé avant de le transférer.
est il possible d'accelerer et de reduire le transfert des donnees via UDP Socket avec Java. Si ou comment? pardon exemple concret.
Merci
Merci
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
30 mai 2015 à 14:47
30 mai 2015 à 14:47
Bonjour,
Un bon début pour réduire le (temps ? volume ?) des données, c'est de considérer des ZipInputStream et ZipOutputStream qui vont compresser les données, ce qui a évidemment un coût en terme de calcul à l'envoi et à la réception des données, mais permet de gagner sur le transfert des données en soit.
Sinon pour UDP vs TCP regarde cet article : TCP / UDP : Quelles différences ?
Un bon début pour réduire le (temps ? volume ?) des données, c'est de considérer des ZipInputStream et ZipOutputStream qui vont compresser les données, ce qui a évidemment un coût en terme de calcul à l'envoi et à la réception des données, mais permet de gagner sur le transfert des données en soit.
Sinon pour UDP vs TCP regarde cet article : TCP / UDP : Quelles différences ?
23 août 2011 à 13:01
merci
26 nov. 2011 à 15:10
Et puis, drvrai-je mettre chaque classe ainsi décrite dans un fichier .java séparément?
26 nov. 2011 à 15:13