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