Bonjour la liste,

J'ai quelques questions super int�ressantes sur les sockets :-)

La premi�re concerne un probl�me avec un envoi sur un pool de sockets
qui se bloque c�t� serveur. Bon c'est plut�t compliqu�.

Voil� � quoi ca ressemble :

Document xmlDoc = ...... ; // un doc XML

// Je parcours ma liste de sockets
while (MaListeDeSockets.hasMoreElements())
{
        Socket MaSocketEnCours (Socket)MaListeDeSockets.nextElement ();
        try
        {
                // on va �crire sur MaSortie
                synchronized (MaSocketEnCours.getOutputStream())
                {
                        OutputStream MaSortie = MaSocketEnCours.getOutputStream();
                        XMLOutputter xmlOut = new XMLOutputter ();
                        xmlOut.output(xmlDoc, MaSortie) ;
                        MaSortie.write (0);
                        MaSortie.flush();
                }
        }
        catch (IOException ex)
        {
                // erreur d'�criture l�
                c.kill();
        }
}


Il arrive que cette proc�dure se bloque. J'y vois 2 explications
possibles :

1. il y a un deadlock sur l'objet synchronis�
(MaSocketEnCours.getOutputStream())
2. une des m�thodes ne retourne pas (MaSortie.write()) : ces m�thodes sont
bloquantes.

Que pensez-vous de ces 2 hypoth�ses. Avez-vous rencontr� ce genre de pbs, ou
des pbs
plus g�n�raux de sockets qui se bloquent.

Pour r�soudre la 2e hypothese, j'ai ajout� �a � l'initialisation de chaque
socket :
        MaSocketEnCours.setSoTimeout(3000);
        MaSocketEnCours.setTcpNoDelay(true);
        MaSocketEnCours.setSoLinger(true, 2000)

La 1�re fonction �tant celle sur laquelle je compte pour d�bloquer la
socket.
Est-ce que quelqu'un sait si, avec setSoTimeout, je suis s�r que
MaSortie.write()
va rendre la main au bout de 3s, comme �a a l'air d'�tre �crit dans la doc ?

Merci,
Damien






Répondre à