IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Envoi de fichier en TCP


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 7
    Points : 8
    Points
    8
    Par défaut Envoi de fichier en TCP
    Bonjour
    J'essaye de transférer un fichier d'un poste a un autre en TCP. La taille des données que j'ai choisi est 65535 (taille des données TCP).. Voici mon code client
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    private static final int _65536 = 65535;
     
    	public void transferer(){
    		File fi= new File (NOMFICHIER_);
    		int taille = new Long (fi.length()).intValue();
    		System.out.println(taille);
     
     
    		Socket skt= null;
    		InetAddress inet= null;
    		try {
    		inet = InetAddress.getLocalHost();
     
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		try {
    			skt = new Socket(inet, 3333);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		try {
    			skt.setSendBufferSize(_65536);
    		} catch (SocketException e2) {
    			// TODO Auto-generated catch block
    			e2.printStackTrace();
    		}
     
     
     
    		FileInputStream fichier= null;
    		try {
    			fichier = new FileInputStream(NOMFICHIER_);
    		} catch (FileNotFoundException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
     
     
    //		byte [] tableau = new byte[taille];
     
     
     
    		int nbEnvoie = taille/_65536;
    		int rest = taille%_65536;
     
     
    		BufferedOutputStream out = null;
    		try {
    			out = new BufferedOutputStream(skt.getOutputStream());
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		byte [] tabUnEnvoie= new byte [_65536];
     
     
    		for (int i=0; i<nbEnvoie;i++){
     
    			try {
    				fichier.read(tabUnEnvoie,0,tabUnEnvoie.length);
    			} catch (IOException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
     
     
     
    //			System.arraycopy(tableau, i*_65536, tabUnEnvoie, 0, _65536);
     
    			try {
    				out.write(tabUnEnvoie);
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
    			try {
    				out.flush();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
     
    			System.out.println("paquet num ="+(i+1)+"["+(i*_65536)+"]="+tabUnEnvoie[0]+"\t["+((i*_65536)-1)+"]=" +tabUnEnvoie[_65536-1]);
    		}//fin for
     
    		if (rest!=0){
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    //			System.arraycopy(tableau, nbEnvoie*_65536, tabUnEnvoie, 0, rest);
    			try {
    				fichier.read(tabUnEnvoie,0,rest);
    			} catch (IOException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
     
    			try {
    				out.write(tabUnEnvoie);
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			System.out.println("["+(nbEnvoie*_65536)+"]="+tabUnEnvoie[0]+"\t["+((taille)-1)+"]=" +tabUnEnvoie[rest-1]);
     
    			try {
    				fichier.close();
    			} catch (IOException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
     
    			try {
    				out.flush();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    Mon code serveur
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    private static final int _65536 = 65535;
    	public void gerer(){
    		ServerSocket serverS_= null;
    		try {
    			 serverS_ = new ServerSocket(3333);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		Socket skt= null;
     
    		try {
    			skt= serverS_.accept();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		try {
    			skt.setReceiveBufferSize(_65536);
    		} catch (SocketException e2) {
    			// TODO Auto-generated catch block
    			e2.printStackTrace();
    		}
     
    		BufferedInputStream in= null;
     
    		try {
    			in= new BufferedInputStream(skt.getInputStream());
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		//58015
    		byte [] paquet = new byte [_65536];
     
    		int tailleFichier = 826531;
    		int nbEnvoie = tailleFichier/_65536;
    		int rest = tailleFichier%_65536;
     
    		FileOutputStream fileOut = null;
    		try {
    			fileOut =new FileOutputStream(NOMFICHIER_,true);
    		} catch (FileNotFoundException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
     
    		for (int i=0; i<nbEnvoie;i++){
     
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    			try {
    				in.read(paquet,0,_65536);
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			try {
    				fileOut.write(paquet);
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			try {
    				fileOut.flush();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
    			System.out.println("paquet num ="+(i+1)+"["+(i*_65536)+"]="+paquet[0]+"\t["+((i*_65536)-1)+"]=" +paquet[_65536-1]);
    		}//fin for
     
    		if (rest!=0){
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    			try {
    				in.read(paquet,0,rest);
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			try {
    				fileOut.write(paquet,0,rest);
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			try {
    				fileOut.flush();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
    			try {
    				fileOut.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			System.out.println("paquet num ="+(nbEnvoie+1)+"["+(nbEnvoie*_65536)+"]="+paquet[0]+"\t["+((tailleFichier)-1)+"]=" +paquet[rest]);
    		}
    	}
    Si je ne mets pas le bout de code Thread.sleep(duree) avec une grande durée , mon serveur intercepte des paquets invalides (Par exemple: En m'affichant le contenu du paquet 1 et 2, je constate que ce ne sont pas les mêmes que ceux envoyés par le client.)
    C'est quoi la façon pour éviter d'utiliser le Thread.sleep car j'ai besoin que mon transfert soit le plus rapide possible mais sans pertes de paquets... Est ce que je dois modifier la taille de paquet? y-il une façon de bloquer l'envoie du paquet suivant jusqu’à ce que le récepteur ait reçu le bon paquet? ...
    L'exception levé : le serveur ferme la connection car selon lui, vu qu'il reçoit 2 paquets non envoyées par l'expéditeur, de plus, et ignore les deux derniers paquets... Le nombre de paquets non envoyées par le client varie, parfois 2 paquets parfois 3...

    voici ce que m'affiche ma console du coté client:
    826531
    paquet num =1[0]=-1 [-1]=-31
    paquet num =2[65535]=-105 [65534]=-93
    paquet num =3[131070]=62 [131069]=-6
    paquet num =4[196605]=87 [196604]=46
    paquet num =5[262140]=-97 [262139]=-41
    paquet num =6[327675]=-49 [327674]=-99
    paquet num =7[393210]=-90 [393209]=-33
    paquet num =8[458745]=-77 [458744]=48
    paquet num =9[524280]=11 [524279]=7
    java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    paquet num =10[589815]=39 [589814]=52
    paquet num =11[655350]=-94 [655349]=-94
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at java.io.BufferedOutputStream.write(Unknown Source)
    at java.io.FilterOutputStream.write(Unknown Source)
    at client.Client.transferer(Client.java:90)
    at client.MainClient.main(MainClient.java:11)
    java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at java.io.BufferedOutputStream.write(Unknown Source)
    at java.io.FilterOutputStream.write(Unknown Source)
    at client.Client.transferer(Client.java:90)
    at client.MainClient.main(MainClient.java:11)
    java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at java.io.BufferedOutputStream.write(Unknown Source)
    at java.io.FilterOutputStream.write(Unknown Source)
    at client.Client.transferer(Client.java:90)
    at client.MainClient.main(MainClient.java:11)
    java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at java.io.BufferedOutputStream.write(Unknown Source)
    at java.io.FilterOutputStream.write(Unknown Source)
    at client.Client.transferer(Client.java:129)
    at client.MainClient.main(MainClient.java:11)
    paquet num =12[720885]=31 [720884]=-54
    [786420]=87 [826530]=-39
    Celle du serveur
    paquet num =1[0]=-1 [-1]=0
    paquet num =2[65535]=57 [65534]=0
    paquet num =3[131070]=75 [131069]=0
    paquet num =4[196605]=42 [196604]=0
    paquet num =5[262140]=62 [262139]=-6
    paquet num =6[327675]=87 [327674]=46
    paquet num =7[393210]=-97 [393209]=-41
    paquet num =8[458745]=-49 [458744]=-99
    paquet num =9[524280]=-90 [524279]=-33
    paquet num =10[589815]=-77 [589814]=-33
    paquet num =11[655350]=85 [655349]=-33
    paquet num =12[720885]=-94 [720884]=-33
    paquet num =13[786420]=11 [826530]=-8
    Quand j'utilise le déboguer de chaque coté, le fichier est transféré sans problèmes (sauf la dernière trame dont la taille est inférieur a 65535).

    Merci

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Pourquoi tu met un try/catch individuelle sur toutes les instructions ?
    C'est affreux à lire !


    Et pour un serveur la gestion des fermetures des flux est affreuse. Utilises un try/finally par flux, ou alors le try-with-resource de Java 7...


    Enfin lorsque tu lis un paquet, tu ne vérifies pas le nombre de byte réellement lu rien ne dit que tu recevras le paquet en entier...

    Ton problème vient sûrement de là !

    a++

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Pourquoi tu met un try/catch individuelle sur toutes les instructions ?
    C'est affreux à lire !


    Et pour un serveur la gestion des fermetures des flux est affreuse. Utilises un try/finally par flux, ou alors le try-with-resource de Java 7...


    Enfin lorsque tu lis un paquet, tu ne vérifies pas le nombre de byte réellement lu rien ne dit que tu recevras le paquet en entier...

    Ton problème vient sûrement de là !

    a++
    Désolé pour le try catch, mais je dois gérer chaque erreur a part, la je le gère pas mais je vais le rajouter.

    SVP pouviez vous développer ou mieux expliquer ce que vous m'aviez dis. En effet le cours de réseaux est l'un des rares cours que j'ai raté (je l'ai réussi mais de justesse).
    Merci beaucoup

    Pour le try-with-resource de Java 7, je suis entrain de lire a partir d'un des liens que vous aviez dans votre signature. Merci

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Tonton Dalitou Voir le message
    Désolé pour le try catch, mais je dois gérer chaque erreur a part, la je le gère pas mais je vais le rajouter.
    Sauf que tu ne gères rien du tout avec tous ces try/catch. Tu ne fais juste que retarder le problème.

    Ce serait bien plus visible et efficace d'utiliser un seul try/catch qui englobe le tout... voir même de laisser la méthode remonter l'exception...

    Citation Envoyé par Tonton Dalitou Voir le message
    SVP pouviez vous développer ou mieux expliquer ce que vous m'aviez dis. En effet le cours de réseaux est l'un des rares cours que j'ai raté (je l'ai réussi mais de justesse).
    Bah grosso-modo tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    in.read(paquet,0,N);
    fileOut.write(paquet,0,N);
    Or tu ne peux pas savoir combien de donnée seront lu par read(). Cette dernière lira entre 1 et "N" bytes, et donc en écrivant forcément "N" bytes tu as de forte chance d'écrire des données incorrect.

    Il faudrait faire grosso-modo quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int len = in.read(paquet);
    if (len>0) {
        out.write(paquet, 0, len);
    }

    a++

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Citation Envoyé par Tonton Dalitou Voir le message
    Voici mon code client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final int _65536 = 65535;
    Mon code serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final int _65536 = 65535;
    C'est une blague ou t'es sérieux avec cette constante?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. envoi de fichier via socket TCP
    Par thaiexpat dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 27/11/2013, 20h08
  2. Envoie de fichiers multiples via TCP
    Par Invité dans le forum C#
    Réponses: 1
    Dernier message: 25/10/2011, 20h40
  3. [Débutant] Envoi de fichier par socket
    Par zapho dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 26/05/2004, 18h58
  4. [C#] Envoi de fichier xml
    Par minnieBis dans le forum ASP.NET
    Réponses: 16
    Dernier message: 25/05/2004, 14h28
  5. [Socket]envoie de fichier!!!
    Par SamDaKap dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/11/2002, 08h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo