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 :

Problème sur synchronized


Sujet :

Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème sur synchronized
    Bonjour, je vient vers vous car j'ai un soucis avec mon code java que je n'arrive pas à élucider.
    C'est un code qui permet de faire un réseau client/serveur avec comme client as3 et le serveur en java.
    Le soucis vient de facon aléatoire dans le temps mais toujours au meme endroit dans le code.
    Voici en premier le code as3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var xmlSocket:XMLSocket = new XMLSocket();
    	xmlSocket.addEventListener(Event.CONNECT , onConnected);
    	xmlSocket.connect("1.2.3.4",5678);
     
    function onConnected(evt:Event)
    {	xmlSocket.send("intel~est connecté(e)");
    	trace("connection = ok");
    }
    Puis le code lancement 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
    package xsocketchatserver;
     
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import org.xsocket.connection.*;
     
    public class XSocketChatServer
    {   protected static IServer srv = null;
     
        // code servant a ecrire dans le fichier log
        static BufferedWriter bw = null;
        // code servant a ecrire dans le fichier log
     
        public static void main(String[] args)
        {   try
            {   // code servant a ecrire dans le fichier log
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                String monHeure = sdf.format(new Date());
                String content = monHeure + " : main<br/>";
                File file =new File("logChat.txt");
                if(!file.exists()){file.createNewFile();}
                bw = new BufferedWriter(new FileWriter(file,true));
                bw.write(content);
                bw.flush();
                bw.close();
                // code servant a ecrire dans le fichier log
     
                srv = new Server(5678, new xSocketDataHandler());
                srv.run();
            }
            catch(Exception ex)
            {   System.out.println(ex.getMessage());
            }
        }
     
        protected static void shutdownServer()
        {   try
            {   // code servant a ecrire dans le fichier log
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                String monHeure = sdf.format(new Date());
                String content = monHeure + " : shutdownServer<br/>";
                File file =new File("logChat.txt");
                if(!file.exists()){file.createNewFile();}
                bw = new BufferedWriter(new FileWriter(file,true));
                bw.write(content);
                bw.flush();
                bw.close();
                // code servant a ecrire dans le fichier log
     
                srv.close();
            }
            catch(Exception ex)
            {   System.out.println(ex.getMessage());
            }
        }
    }
    Puis le code qui traite les connections :
    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
    package xsocketchatserver;
     
    import java.io.IOException;
    import java.nio.BufferOverflowException;
    import java.nio.BufferUnderflowException;
    import java.nio.channels.ClosedChannelException;
    import java.util.*;
    import org.xsocket.*;
    import org.xsocket.connection.*;
     
    // code servant a ecrire dans le fichier log
    import java.io.File;
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.text.SimpleDateFormat;
    // code servant a ecrire dans le fichier log
     
    public class xSocketDataHandler implements IDataHandler, IConnectHandler, IDisconnectHandler
    {   private Set<INonBlockingConnection> sessions = Collections.synchronizedSet(new HashSet<INonBlockingConnection>());
     
        // code servant a ecrire dans le fichier log
        static BufferedWriter bw = null;
        // code servant a ecrire dans le fichier log
     
        public boolean onData(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, ClosedChannelException, MaxReadSizeExceededException
        {   // code servant a ecrire dans le fichier log
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            String monHeure = sdf.format(new Date());
            String content = monHeure + " : Incoming data A : "+nbc.getRemoteAddress()+"<br/>";
            File file =new File("logChat.txt");
            if(!file.exists()){file.createNewFile();}
            bw = new BufferedWriter(new FileWriter(file,true));
            bw.write(content);//Start writing to the output stream
            bw.flush();
            bw.close();
            // code servant a ecrire dans le fichier log
     
            try
            {   String data = nbc.readStringByDelimiter("\0");
     
                // code servant a ecrire dans le fichier log
                String contentA = monHeure + " : Incoming data B: " + data + " : "+nbc.getRemoteAddress()+"<br/>";
                File fileA =new File("logChat.txt");
                if(!fileA.exists()){fileA.createNewFile();}
                bw = new BufferedWriter(new FileWriter(fileA,true));
                bw.write(contentA);//Start writing to the output stream
                bw.flush();
                bw.close();
                // code servant a ecrire dans le fichier log
     
                if(data.trim().length() > 0)
                {   //System.out.println("Incoming data : " + data);
     
                    // code servant a ecrire dans le fichier log
                    String contentB = monHeure + " : Incoming data C: " + data + " : "+nbc.getRemoteAddress()+"<br/>";
                    File fileB =new File("logChat.txt");
                    if(!fileB.exists()){fileB.createNewFile();}
                    bw = new BufferedWriter(new FileWriter(fileB,true));
                    bw.write(contentB);//Start writing to the output stream
                    bw.flush();
                    bw.close();
                    // code servant a ecrire dans le fichier log
     
                    if(data.equalsIgnoreCase("<policy-file-request/>"))
                    {   nbc.write("<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"5678\"/></cross-domain-policy>\0");
                        nbc.flush();
                        return true;
                    }
     
                    String[] message = data.split("~");
     
                    // code servant a ecrire dans le fichier log
                    String contentC = monHeure + " : Incoming data D: " + message + " : "+nbc.getRemoteAddress()+"<br/>";
                    File fileC =new File("logChat.txt");
                    if(!fileC.exists()){fileC.createNewFile();}
                    bw = new BufferedWriter(new FileWriter(fileC,true));
                    bw.write(contentC);//Start writing to the output stream
                    bw.flush();
                    bw.close();
                    // code servant a ecrire dans le fichier log
     
                    sendMessageToAll(message[0], message[1]);
     
                    if(message[1].equalsIgnoreCase("chutagobyfubewigoluka"))
                    {   XSocketChatServer a = new XSocketChatServer();
                        a.shutdownServer();
                    }
                }
            }
            catch(IOException | BufferOverflowException ex)
            {   //System.out.println("onData: " + ex.getMessage());
     
                // code servant a ecrire dans le fichier log
                String contentD = monHeure + " : Incoming data error : " + ex.getMessage() + " : "+nbc.getRemoteAddress()+"<br/>";
                File fileD =new File("logChat.txt");
                if(!fileD.exists()){fileD.createNewFile();}
                bw = new BufferedWriter(new FileWriter(fileD,true));
                bw.write(contentD);//Start writing to the output stream
                bw.flush();
                bw.close();
                // code servant a ecrire dans le fichier log
            }
     
            return true;
        }
     
        private void sendMessageToAll(String user, String message) throws IOException
        {   // code servant a ecrire dans le fichier log
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            String monHeure = sdf.format(new Date());
            String content = monHeure + " : Outgoing data : <b>" + user + "</b>: " + message + "<br/>";
            File file =new File("logChat.txt");
            if(!file.exists()){file.createNewFile();}
            bw = new BufferedWriter(new FileWriter(file,true));
            bw.write(content);//Start writing to the output stream
            bw.flush();
            bw.close();
            // code servant a ecrire dans le fichier log
     
            try
            {   synchronized(sessions)
                {   Iterator<INonBlockingConnection> iter = sessions.iterator();
     
                    // code servant a ecrire dans le fichier log
                    String contentC = monHeure + " : Outgoing data A : <b>" + user + "</b>: " + message + "<br/>";
                    File fileC =new File("logChat.txt");
                    if(!fileC.exists()){fileC.createNewFile();}
                    bw = new BufferedWriter(new FileWriter(fileC,true));
                    bw.write(contentC);//Start writing to the output stream
                    bw.flush();
                    bw.close();
                    // code servant a ecrire dans le fichier log
     
                    while(iter.hasNext())
                    {   INonBlockingConnection nbConn = (INonBlockingConnection) iter.next();
     
                        if(nbConn.isOpen())
                        {   nbConn.write("<b>" + user + "</b>: " + message + "<br />\0");
                            nbConn.flush();
                        }
                    }
                }
     
                //System.out.println("Outgoing data: <b>" + user + "</b>: " + message + "<br />\0");
     
                // code servant a ecrire dans le fichier log
                String contentA = monHeure + " : Outgoing data B : <b>" + user + "</b>: " + message + "<br/>";
                File fileA =new File("logChat.txt");
                if(!fileA.exists()){fileA.createNewFile();}
                bw = new BufferedWriter(new FileWriter(fileA,true));
                bw.write(contentA);//Start writing to the output stream
                bw.flush();
                bw.close();
                // code servant a ecrire dans le fichier log
            }
            catch(IOException | BufferOverflowException ex)
            {   //System.out.println("sendMessageToAll: " + ex.getMessage());
     
                // code servant a ecrire dans le fichier log
                String contentB = monHeure + " : Outgoing data error : " + ex.getMessage() + "<br/>";
                File fileB =new File("filename.txt");
                if(!fileB.exists()){fileB.createNewFile();}
                bw = new BufferedWriter(new FileWriter(fileB,true));
                bw.write(contentB);//Start writing to the output stream
                bw.flush();
                bw.close();
                // code servant a ecrire dans le fichier log
            }
        }
     
        public boolean onConnect(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, MaxReadSizeExceededException
        {   // code servant a ecrire dans le fichier log
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            String monHeure = sdf.format(new Date());
            String content = monHeure + " : onConnect : "+nbc.getRemoteAddress()+"<br/>";
            File file =new File("logChat.txt");
            if(!file.exists()){file.createNewFile();}
            bw = new BufferedWriter(new FileWriter(file,true));
            bw.write(content);//Start writing to the output stream
            bw.flush();
            bw.close();
            // code servant a ecrire dans le fichier log
     
            try
            {   // code servant a ecrire dans le fichier log
                String contentA = monHeure + " : onConnect A : "+nbc.getRemoteAddress()+"<br/>";
                File fileA =new File("logChat.txt");
                if(!fileA.exists()){fileA.createNewFile();}
                bw = new BufferedWriter(new FileWriter(fileA,true));
                bw.write(contentA);//Start writing to the output stream
                bw.flush();
                bw.close();
                // code servant a ecrire dans le fichier log
     
                synchronized(sessions)
                {   
                    // code servant a ecrire dans le fichier log
                    String contentB = monHeure + " : onConnect B : "+nbc.getRemoteAddress()+"<br/>";
                    File fileB =new File("logChat.txt");
                    if(!fileB.exists()){fileB.createNewFile();}
                    bw = new BufferedWriter(new FileWriter(fileB,true));
                    bw.write(contentB);//Start writing to the output stream
                    bw.flush();
                    bw.close();
                    // code servant a ecrire dans le fichier log
     
                    sessions.add(nbc);
                }
     
                //System.out.println("onConnect");
     
                // code servant a ecrire dans le fichier log
                String contentC = monHeure + " : onConnect C : "+nbc.getRemoteAddress()+"<br/>";
                File fileC =new File("logChat.txt");
                if(!fileC.exists()){fileC.createNewFile();}
                bw = new BufferedWriter(new FileWriter(fileC,true));
                bw.write(contentC);//Start writing to the output stream
                bw.flush();
                bw.close();
                // code servant a ecrire dans le fichier log
            }
            catch(Exception ex)
            {   //System.out.println("onConnect: " + ex.getMessage());
     
                // code servant a ecrire dans le fichier log
                String contentD = monHeure + " : onConnect error : " + ex.getMessage() + " : "+nbc.getRemoteAddress()+"<br/>";
                File fileD =new File("logChat.txt");
                if(!fileD.exists()){fileD.createNewFile();}
                bw = new BufferedWriter(new FileWriter(fileD,true));
                bw.write(contentD);//Start writing to the output stream
                bw.flush();
                bw.close();
                // code servant a ecrire dans le fichier log
            }
            return true;
        }
     
        public boolean onDisconnect(INonBlockingConnection nbc) throws IOException
        {   try
            {   synchronized(sessions)
                {
                    sessions.remove(nbc);
                }
     
                //System.out.println("onDisconnect");
     
                // code servant a ecrire dans le fichier log
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                String monHeure = sdf.format(new Date());
                String content = monHeure + " : onDisconnect : "+nbc.getRemoteAddress()+"<br/>";
                File file =new File("logChat.txt");
                if(!file.exists()){file.createNewFile();}
                bw = new BufferedWriter(new FileWriter(file,true));
                bw.write(content);//Start writing to the output stream
                bw.flush();
                bw.close();
                // code servant a ecrire dans le fichier log
            }
            catch(Exception ex)
            {   //System.out.println("onDisconnect: " + ex.getMessage());
     
                // code servant a ecrire dans le fichier log
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                String monHeure = sdf.format(new Date());
                String content = monHeure + " : onDisconnect error : " + ex.getMessage() + " : "+nbc.getRemoteAddress()+"<br/>";
                File file =new File("logChat.txt");
                if(!file.exists()){file.createNewFile();}
                bw = new BufferedWriter(new FileWriter(file,true));
                bw.write(content);//Start writing to the output stream
                bw.flush();
                bw.close();
                // code servant a ecrire dans le fichier log
            }
            return true;
        }
    }
    Et enfin le fichier log :
    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
    22:19:41 : onConnect : /5.4.3.2
    22:19:41 : onConnect A : /5.4.3.2
    22:19:41 : onConnect B : /5.4.3.2
    22:19:41 : onConnect C : /5.4.3.2
    22:19:41 : Incoming data A : /5.4.3.2
    22:19:41 : Incoming data B: YYY~est connecté(e) : /5.4.3.2
    22:19:41 : Incoming data C: YYY~est connecté(e) : /5.4.3.2
    22:19:41 : Incoming data D: [Ljava.lang.String;@2350ad83 : /5.4.3.2
    22:19:41 : Outgoing data : YYY: est connecté(e)
    22:19:41 : Outgoing data A : YYY: est connecté(e)
    22:19:41 : Outgoing data B : YYY: est connecté(e)
     
    22:20:03 : onConnect : /9.8.7.6
    22:20:03 : onConnect A : /9.8.7.6
    22:20:03 : onConnect B : /9.8.7.6
    22:20:03 : onConnect C : /9.8.7.6
    22:20:03 : Incoming data A : /9.8.7.6
    22:20:03 : Incoming data B: XXX~est connecté(e) : /9.8.7.6
    22:20:03 : Incoming data C: XXX~est connecté(e) : /9.8.7.6
    22:20:03 : Incoming data D: [Ljava.lang.String;@7224ccce : /9.8.7.6
    22:20:03 : Outgoing data : XXX: est connecté(e)
    22:20:03 : Outgoing data A : XXX: est connecté(e)
    22:20:03 : Outgoing data B : XXX: est connecté(e)
     
    22:20:26 : Incoming data A : /9.8.7.6
    22:20:26 : Incoming data B: XXX~Je te vois YYY! : /9.8.7.6
    22:20:26 : Incoming data C: XXX~Je te vois YYY! : /9.8.7.6
    22:20:26 : Incoming data D: [Ljava.lang.String;@6e431d9d : /9.8.7.6
    22:20:26 : Outgoing data : XXX: Je te vois YYY!
    22:20:26 : Outgoing data A : XXX: Je te vois YYY!
    22:20:26 : Outgoing data B : XXX: Je te vois YYY!
     
    22:21:04 : Incoming data A : /5.4.3.2
    22:21:04 : Incoming data B: YYY~Moi aussi ! : /5.4.3.2
    22:21:04 : Incoming data C: YYY~Moi aussi ! : /5.4.3.2
    22:21:04 : Incoming data D: [Ljava.lang.String;@6d552524 : /5.4.3.2
    22:21:04 : Outgoing data : YYY: Moi aussi !
    22:21:04 : Outgoing data A : YYY: Moi aussi !
    22:21:04 : Outgoing data B : YYY: Moi aussi !
     
    22:22:47 : Incoming data A : /5.4.3.2
    22:22:47 : Incoming data B: YYY~je viens de partir !! : /5.4.3.2
    22:22:47 : Incoming data C: YYY~je viens de partir !! : /5.4.3.2
    22:22:47 : Incoming data D: [Ljava.lang.String;@41796abe : /5.4.3.2
    22:22:47 : Outgoing data : YYY: je viens de partir !!
    22:22:47 : Outgoing data A : YYY: je viens de partir !!
     
    22:24:30 : onConnect : /5.4.3.2
    22:24:30 : onConnect A : /5.4.3.2
    Le probleme survient à 22:24:30 lorsque l'ip 5.4.3.2 tente de se connecter, la connection s'etablit correctement comme on peut le voir dans les log et dans le trace dans le fichier as3 mais bloque au niveau du synchronized(sessions){} dans la fonction public boolean onConnect(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, MaxReadSizeExceededException.

    Lorsque cela arrive, tout le systeme du d'echange de message du tchat est planté, je suis obligé de kill le processus (le serveur java etant sur une debian) et de le relancer. Cela provient au bout de 30 min ou au bout de 5h, qu'il y ai 10 ou 80 personnes dessus.

    N'etant pas dev java de base, il y a surement une erreur dedans mais je ne la voit pas. Merci pour vos futures réponses.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ca veux dire que quelqu'un a toujours le verrou sur l'objet sessions. Plusieurs remarques:

    1) il est inutiles d'obtenir un verrou sur tes sessions à cet endroit là: ta session étant déjà synchonized, ce verrou est inutile
    2) on vous dans ton log:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    22:21:04 : Outgoing data A : YYY: Moi aussi !
    22:21:04 : Outgoing data B : YYY: Moi aussi !
     
    22:22:47 : Incoming data A : /5.4.3.2
    22:22:47 : Incoming data B: YYY~je viens de partir !! : /5.4.3.2
    22:22:47 : Incoming data C: YYY~je viens de partir !! : /5.4.3.2
    22:22:47 : Incoming data D: [Ljava.lang.String;@41796abe : /5.4.3.2
    22:22:47 : Outgoing data : YYY: je viens de partir !!
    22:22:47 : Outgoing data A : YYY: je viens de partir !!
    à 22:22:37, il manque le Outgoing data B, ce qui signifie que soit tu tourne en boucle dans sendMessageToAll, soit tu est en pause de longueur indéterminée dans la section synchronized. Voyons le code
    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
    synchronized(sessions)
                {   Iterator<INonBlockingConnection> iter = sessions.iterator();
     
                    // code servant a ecrire dans le fichier log
                    //... marche puisqu'on a le message dans le log
                    // code servant a ecrire dans le fichier log
     
                    while(iter.hasNext())
                    {   INonBlockingConnection nbConn = (INonBlockingConnection) iter.next();
     
                        if(nbConn.isOpen())
                        {   nbConn.write("<b>" + user + "</b>: " + message + "<br />\0");
                            nbConn.flush();
                        }
                    }
                }
    Mon avis est que INonBlockingConnection.write n'est pas non bloquant et au contraire, bloque sur un message. Probablement un client qui s'est déconnecté sans prévenir et donc les paquet vont attendre quelque temps avant de recevoir un ICMP d'erreur d'envoi en réponse. Pire si la cible a un firewall un peu évolué, celui-ci jettera le paquet sans même jamais te dire qu'il ne peux pas l'acheminer. => Revoir le code en question pour gérer les connection "bizarres"

    dernière chose, c'est vraiment pas un bon plan d'ouvrir à chaque fois ton fichier de log, c'est long et peu performant. Préfère un PrintStream ouvert du début à la fin de ton application où tu te contente d'appeler println()


  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Donc si je comprend bien, le probleme viendrait de ma fonction sendMessageToAll qui me bloque le serveur d'ou le fait que plus personne ne s'en servir.

    tchize_ : Probablement un client qui s'est déconnecté sans prévenir.
    Comment un client pourrait il partir sans que le serveur ne soit au courant?

    Comme solution, il faudrait que je mette une sorte de timer à l'interieur qui au bout finirat par passer a la suite?

    Et merci pour le systeme d'ecriture dans le fichier log

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par nerzhul64 Voir le message
    Comment un client pourrait il partir sans que le serveur ne soit au courant?
    Cable réseau débranché
    Modem router qui reset
    Application fermée
    Bouton Power
    ....

    TCP c'est jamais que de paquets envoyés à l'aveugle avec un numéro d'ordre.

    Quand tu reçois de l'autre coté "ok j'ai bien recu jusque XXX", tu sais que tout marche
    Quand tu reçois de l'autre coté un paquet "RESET" tu sais que la connection est morte
    Quand tu reçois strictement rien, tu ne peux conclure ni l'un ni l'autre.

    Ce que tu dois faire:

    1) mettre un timeout sur tes opération (socket.setSOTimeout())
    2) ne pas garder de verrou quand tu fais des opérations potentiellement longues de ce type
    3) répartir tes opérations réseau entre plusieurs threads, il y a pas mal de manière de faire, mais faut apprendre java plus en profondeur


    Quel que soit le language, écrire un serveur réseau qui tient la route, ce n'est pas une opération triviale
    [/QUOTE]

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  2. Problème sur fiche MDIchild
    Par nivet dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/01/2004, 08h07
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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