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

Java Discussion :

Communication Java/C++ -> read() bloquant


Sujet :

Java

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Par défaut Communication Java/C++ -> read() bloquant
    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
        {
     
        }
    }

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    J'ai pas envie d'analyser à fond ce que fait le C++, tu pourrais te contenter de nous dire ce qui est censé se passer.

    Mais bon, de ce que je vois, côté Java, tu fais un readLine().
    Et... Le serveur envoie une fin de ligne, un jour ? Parce que bon, comme son nom l'indique... Ça ne se terminiera que sur une fin de ligne ou si la socket se ferme.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Par défaut Merci !
    Bonsoir,

    oui, effectivement, c'est vraiment tout con, un simple '\r' à la fin du tableau qu'envoi le serveur et j'ai mon readline() qui s'arrête ...

    Merci !

    PS: Ce code est un code de texte, mon serveur en C++ ne fait que renvoyer les infos que lui envoyer le premier client à l'autre en les identifiant par le premier membre du tableau qu'ils envoient.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 68
    Par défaut
    t'as pas mis résolu

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

Discussions similaires

  1. access denied (java.util.PropertyPermission java.io.tmpdir read)
    Par benyboyJAVA dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 12/01/2009, 11h12
  2. communication Java et C en UDP
    Par loic911 dans le forum Développement
    Réponses: 1
    Dernier message: 21/11/2006, 14h48
  3. Communication java à travers un firewall
    Par peyodroop dans le forum Général Java
    Réponses: 3
    Dernier message: 06/06/2006, 11h48
  4. Communication JAVA & PL/SQL
    Par Titouf dans le forum PL/SQL
    Réponses: 1
    Dernier message: 12/01/2006, 10h18
  5. java.sql.SQLException: read-only
    Par mehdi.kiwi dans le forum Oracle
    Réponses: 6
    Dernier message: 17/05/2005, 16h46

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