3 votes

Quelle taille peut avoir le sendbuffersize dans la classe java Socket ?

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().

  1. Quelqu'un peut-il expliquer pourquoi ?
  2. Quelle peut être la taille de la mémoire tampon des sockets ? Quelle est la limite ?
  3. Quelle est la relation entre le tampon BufferedOutputStream et le tampon Socket ?

Merci beaucoup !

0voto

AntonyM Points 816

Il semble que l'autre côté ne lise pas le socket et que le socket se bloque. Si vous avez écrit l'autre côté (le côté qui est censé lire le socket), le problème se situe probablement dans ce code. Si ce n'est pas le cas et que vous essayez d'implémenter le standard FTP et de parler à un serveur FTP connu et fonctionnel, il est plus probable que le problème vienne de la façon dont vous l'implémentez du côté client (par exemple, vous essayez d'écrire les données du fichier mais le côté distant ne l'attend pas et attend un message de contrôle ou autre).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X