J'ai une application qui utilise une bibliothèque FTP pour transférer des fichiers. La réception de fichiers fonctionne bien, et la plupart du temps l'envoi de fichiers aussi. Le problème survient lorsque j'essaie d'envoyer un gros fichier (3 Mo), l'application se bloque. Aucun message d'erreur, rien. J'ai débogué et j'ai découvert qu'elle s'arrête au niveau de la fonction socketWrite0()
méthode dans java.net.SocketOutputStream
. Cette méthode ne renvoie jamais les résultats, mais se bloque. Elle est appelée à partir de :java.io.BufferedOutputStream write() which calls java.io.BufferedOutputStream flushBuffer() which calls java.net.SocketOutputStream write() which calls java.net.SocketOutputStream socketWrite() which calls java.net.SocketOutputStream socketWrite0()
Le fichier commence à être transféré, mais la deuxième fois java.io.BufferedOutputStream flushBuffer()
est appelé, le fil de transfert s'arrête et se bloque lorsqu'il arrive à la méthode socketWrite0(). J'ai essayé d'ajuster la taille du tampon dans BufferedOutputStream en envoyant un paramètre dans son constructeur, et il semble que cette taille n'ait pas d'importance, le transfert s'arrête toujours au deuxième flush.
J'ai ensuite essayé de définir le paramètre Socket setSendBufferSize sur 3 000 000, et soudain tout a fonctionné comme il se doit, la taille du BufferedOutputStream étant par défaut. Tant que je fixe cette taille de tampon à un montant supérieur à la taille du fichier, le fichier est transféré et tout va bien ! Si je fixe la taille de la mémoire tampon à 400 000, par exemple, le transfert s'arrête après que cette quantité ait été transférée.
Je ne peux pas augmenter le tampon BufferedOutputStream de manière illimitée. Si je le règle trop grand, la même chose se produit : l'application se bloque à socketWrite0().
- Quelqu'un peut-il expliquer pourquoi ?
- Quelle peut être la taille de la mémoire tampon des sockets ? Quelle est la limite ?
- Quelle est la relation entre le tampon BufferedOutputStream et le tampon Socket ?
Merci beaucoup !