Bonjour à tous,

je vous explique mon projet : créer un système client/serveur/clientII, le clientII et le serveur sont codés en C++ et le client en java. Pourquoi mon client en java ? pour la portativité du java. Et pourquoi pas tout en java ? Car je serais alors limité car je connais peu ce langage surtout au niveau de la connexion série intervenant dans le clientII.

Maintenant le problème: la relation serveur/clientII se déroule très bien sans accros, pas de bloquage au niveau des sockets (normalement le serveur a été programmé pour éviter ça), nickel quoi. Par contre pour le client codé en java, ça bloque au niveau du read() ... Le setSoTimeout() ne règle pas le problème car il me fait fermer mon client -> ce n'est pas le but et en plus sans même recevoir les données serveur. Par contre j'ai remarqué que lorsque tout était bloqué, si je ferme mon serveur, le client va recevoir les données et se fermé par la suite...

Je souhaite comprendre !!!

Je vous mets le code de mon client java, j'espère que quelqu'un pourra m'aider, je désespère un peu

Merci d'avance !


Mon client en java :

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
 
 import java.io.*;
import java.net.*;
 
public class Controle {
	/**
         * @param args
         */
	static int 	PORT = 65000;
	static String 	IP = "127.0.0.1";		 		
 
	public static void main(String[] args) 
						throws UnknownHostException, IOException {
		// TODO Auto-generated method stub
		String	texte_envoi= "";
		String	texte_recu = "";
		char[] 	buffer_envoi			=	new char[128];
		char[]	buffer_reception		= 	new char[128];
 
		for(int i=0; i < 128 ; i++)
		{
			buffer_envoi[i]		= 48;
			buffer_reception[i]	= 48;
		}
		buffer_envoi[0]=50;
		buffer_envoi[1]=48;
		buffer_envoi[2]=52;
		buffer_envoi[3]=53;
		buffer_envoi[4]=54;
		buffer_envoi[126]=55;
		buffer_envoi[127]=56;
 
		while(true)
		{
			/*********************************************************/
			/** Création de la socket                                          **/
			/*********************************************************/
			Socket socket = new Socket(IP,PORT);
			socket.setSoTimeout(1000);
			/*********************************************************/
			/** Initialise les buffers d'entrée et de sortie        **/
			/*********************************************************/
			BufferedReader lecture		 = 	new BufferedReader	( 
										new InputStreamReader(socket.getInputStream()));				   
			BufferedWriter ecriture 	 =  new BufferedWriter  (
										new OutputStreamWriter(socket.getOutputStream()));
			/*********************************************************/
			/** Envoi d'un message                                                      **/
			/*********************************************************/
 
			texte_envoi = new String(buffer_envoi);
 
			ecriture.write(texte_envoi); 
			ecriture.flush();
 
 
			for(int i=0; i < 128 ; i++)
			{
				System.out.print(texte_envoi);
			}
			System.out.println("	fin");
			/*********************************************************/
			/** Réception d'un message                                                 **/
			/*********************************************************/
 
			texte_recu = lecture.readLine();
 
			System.out.println(texte_recu);
 
			lecture.close();
			ecriture.close();
			socket.close();
		}
 
	}
}
Mon serveur en C++ :

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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
 
 
/*****************************************************************/
/** Ozzy Serveur V3                                             **/
/**                                                             **/
/** GASSEN A RIM Niels                                          **/
/**                                                             **/
/** Debut: 31.10.2011                       Fin: 6/11/2011      **/
/**                                                             **/
/** - Amélioration de la lisibilité des classes                 **/
/** serveur et client                                           **/
/** - Amélioration du codage des classes serveur et client      **/
/** - Apparition de la sélection de socket                      **/
/**                                                             **/
/*****************************************************************/
 
#include    "client.h"
#include    "serveur.h"
 
#include    <string.h>
#include    <iostream>
#include    <unistd.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    <errno.h>
 
#define     FALSE       0
#define     TRUE        1
#define     ERREUR      -1
 
 
using namespace std;
 
void traitement(char*, char*, char*, char*);
 
int main()
{
 
    int     i, erreur, fermer_connection;
    int     max_socket;
 
    char     buffer_reception       [128]={48};
    char     buffer_envoi           [128]={48};
    char     buffer_stockage_Ozzy   [128]={48};
    char     buffer_stockage_Ctrl   [128]={48};
 
    int     desc_pret, stop_serveur = FALSE;
 
    fd_set               set_principal, set_utilise;
    struct  timeval       timeout;
    /**************************************************************/
    /** Présentation du serveur                                  **/
    /**************************************************************/
    cout << "" << endl;
    cout << "\t\t\t\t\t\t *** Ozzy Serveur V3 ***" << endl;
    cout << "" << endl;
    /**************************************************************/
    /** Création des objets client et serveur                    **/
    /**************************************************************/
    Serveur serveur(AF_INET,SOCK_STREAM,0,65000);
    Client client;
    /**************************************************************/
    /** Création de la socket serveur                            **/
    /**************************************************************/
    serveur.creation();
    /**************************************************************/
    /** Paramètrage de la socket serveur et association des      **/
    /** paramètres                                               **/
    /**************************************************************/
    serveur.parametrage();
    serveur.association();
    /**************************************************************/
    /** Mise en écoute de la socket serveur                      **/
    /**************************************************************/
    cout << "Mise en écoute serveur" << endl;
    cout << "..." << endl;
    serveur.ecoute(2);
    /**************************************************************/
    /** Initialisation descripteur de fichier maître             **/
    /**************************************************************/
    FD_ZERO(&set_principal);
    max_socket = serveur.get_socket();
    FD_SET(serveur.get_socket(), &set_principal);
    /**************************************************************/
    /** On met le temps d'attente avant l'arrêt du serveur       **/
    /** a 10h                                                    **/
    /**************************************************************/
    timeout.tv_sec  = 36000;
    timeout.tv_usec = 0;
    /**************************************************************/
    /** Boucles pour recevoir et envoyées les données aux        **/
    /** sockets connectées                                       **/
    /**************************************************************/
    do
    {
        /**********************************************************/
        /** Définition du descripteur de fichier maître en       **/
        /** descripteur de fichier utilisé                       **/
        /**********************************************************/
        memcpy(&set_utilise, &set_principal, sizeof(set_principal));
        /**********************************************************/
        /** On attend une sélection pendant 10h ... ^^           **/
        /**********************************************************/
        cout << "Attente de la sélection serveur" << endl;
        cout << "..." << endl;
        erreur = select(max_socket + 1,
                        &set_utilise, NULL, NULL, &timeout);
        /**********************************************************/
        /** Si select() ne fonctionne pas, on sort               **/
        /**********************************************************/
        if (erreur < 0){
            perror("select");
            break;}
        /**********************************************************/
        /** Si le délai est dépassé                              **/
        /**********************************************************/
        if (erreur == 0){
            printf("select - délai d'attente dépassé\n");
            break;}
        /**********************************************************/
        /** Des socket sont lisibles -> Détermination de ceux-ci **/
        /** Ici erreur donnent le nombre de socket disponibles   **/
        /**********************************************************/
        desc_pret = erreur;
        for (i=0; i <= max_socket  &&  desc_pret > 0; ++i)
        {
            /******************************************************/
            /** On regarde si le set_utilise est pret             */
            /******************************************************/
            if (FD_ISSET(i, &set_utilise))
            {
                /**************************************************/
                /** On a trouvé un socket lisible, on arrête de  **/
                /** chercher les autres lorsqu'on les a tous     **/
                /**************************************************/
                desc_pret -= 1;
                /**************************************************/
                /** On vérifie si c'est le socket serveur        **/
                /**************************************************/
                if (i == serveur.get_socket())
                {
                    /**********************************************/
                    /** On accepte toute les connection sur le   **/
                    /** socket avant de recommencer et de        **/
                    /** rappeler select()                        **/
                    /**********************************************/
                    do
                    {
                        /******************************************/
                        /** Accepte la connexion                 **/
                        /******************************************/
                        client.set_socket(serveur.accepte(client));
                        /******************************************/
                        /** On ajoute la connexion à l'ensemble  **/
                        /** de lecture principal                 **/
                        /******************************************/
                        cout << "Nouvelle connexion :" <<
                                        client.get_socket() << endl;
 
                        FD_SET(client.get_socket(), &set_principal);
 
                        if (client.get_socket() > max_socket)
                            max_socket = client.get_socket();
                        /******************************************/
                        /** On recommence pour accepter une      **/
                        /** nouvelle connexion                   **/
                        /******************************************/
                    } while (client.get_socket() != ERREUR);
                }
                /**************************************************/
                /** C'est une socket qui envoie des données      **/
                /**************************************************/
                else
                {
                    /**********************************************/
                    /** On reçoit les données de toutes les      **/
                    /** sockets avant de reboucler               **/
                    /**********************************************/
                    do
                    {
                        /******************************************/
                        /** Réception des données de la socket   **/
                        /******************************************/
                        erreur = recv(i,buffer_reception,sizeof(buffer_reception),0);
 
                        if (erreur < 0)
                        {
                            if (errno != EWOULDBLOCK)
                            {
                                perror("recv");
                                fermer_connection = TRUE;
                            }
                            break;
                        }
                        /******************************************/
                        /** On vérifie que la connection a été   **/
                        /** fermée par le client                 **/
                        /******************************************/
                        if (erreur == 0)
                        {
                            printf("Connection fermée\n");
                            fermer_connection = TRUE;
                            break;
                        }
                        /******************************************/
                        /** On traite les données pour faire     **/
                        /** le multiplexage                      **/
                        /******************************************/
                        traitement(buffer_reception, buffer_envoi,
                                    buffer_stockage_Ozzy, buffer_stockage_Ctrl);
                        /******************************************/
                        /** Données reçu                         **/
                        /******************************************/
                        cout << "Données reçues:    ";
                        for(int j=0;j<128;j++)
                            cout << buffer_reception[j] ;
                        cout << "   fin " << endl;
                        /******************************************/
                        /** Envoi des données                    **/
                        /******************************************/
                        erreur = send(i, buffer_envoi, sizeof(buffer_envoi), 0);
 
                        if (erreur < 0)
                        {
                            perror("send");
                            fermer_connection = TRUE;
                            break;
                        }
 
                        cout << "Données envoyées:    ";
                        for(int j=0;j<128;j++)
                            cout << buffer_envoi[j] ;
                        cout << "   fin " << endl;
 
                    } while (TRUE);
                    /**********************************************/
                    /** Quand on ferme la connection, on         **/
                    /** supprime les sockets ouvertes et on les  **/
                    /** enlève de la set master                  **/
                    /**********************************************/
                    if (fermer_connection)
                    {
                        close(i);
                        FD_CLR(i, &set_principal);
                        if (i == max_socket)
                        {
                            while (FD_ISSET(max_socket, &set_principal) == FALSE)
                                max_socket -= 1;
                        }
                    }
                } // Fin de la boucle pour les connexion lisible
            } // Fin du if(FD_ISSET(i, &set_utilise))
        } // Fin de la boucle sur les sockets lisibles
    } while(stop_serveur == FALSE);
 
    cout << "..." << endl;
    cout << "Fermeture des sockets serveur et client" << endl;
 
    client.fermeture();
    serveur.fermeture();
 
    return 0;
}
 
 
void traitement(char* buffer_reception, char* buffer_envoi, char* buffer_stockage_Ozzy, char* buffer_stockage_Ctrl)
{
    if(buffer_reception[0] == 49)
    {
        for(int i = 0; i < 128 ; i ++)
        {
            buffer_stockage_Ozzy[i] = buffer_reception[i];
        }
        for(int i = 0; i < 128 ; i ++)
        {
            buffer_envoi[i] = buffer_stockage_Ctrl[i];
        }
        for(int i = 0; i < 128 ; i ++)
        {
            buffer_stockage_Ctrl[i] = 48;
        }
    }
    else if(buffer_reception[0] == 50)
    {
        for(int i = 0; i < 128 ; i ++)
        {
            buffer_stockage_Ctrl[i] = buffer_reception[i];
        }
        for(int i = 0; i < 128 ; i ++)
        {
            buffer_envoi[i] = buffer_stockage_Ozzy[i];
        }
        for(int i = 0; i < 128 ; i ++)
        {
            buffer_stockage_Ozzy[i] = 48;
        }
    }
    else
    {
 
    }
}