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
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
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(); } } }
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.)
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]); } }
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:
Celle du serveur826531
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
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).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
Merci
Partager