2009-09-21 7 views
2

J'essaie de développer une application de transfert de fichiers en Java, avec une applet en tant que client, et une application Java autonome en tant que serveur (sur une machine dédiée hébergée dans un datacenter). J'utilise DataOutputStream/DataInputStream pour transférer les données des deux côtés. Lorsque j'envoie de gros volumes de données, la bande passante est très variable: tout va bien d'abord, puis le flux tcp est gelé pendant 40-50 secondes alors que rien ne se transfère, puis il recommence.Sockets Java et tuning TCP

Lorsque je regarde le flux tcp avec Ethereal, je vois des doublons, des retransmits rapides et des retransmissions de tcp. Mais je ne pense pas que le problème provient de Java: j'ai le même problème avec les transferts FTP dans FileZilla. Mais ... quand j'essaie de transférer des données en utilisant netcat (client netcat + serveur netcat), tout va bien, la bande passante est stable, les paquets tcp perdus semblent être retransmis immédiatement sans aucune pause, quel que soit le volume transféré.

Il est comme si Java n'a pas été aussi talentueux que netcat pour jouer avec des flux tcp ...

J'ai essayé de jouer avec Socket.setSendBufferSize(), mais je ne vois aucune différence. Une idée?

Merci! Et désolé pour mon mauvais anglais ...

+3

dup: http://stackoverflow.com/questions/1169739/java-tcp-socket-data-transfer-is-sloooooow – amischiefr

Répondre

0

Cela ressemble plus à votre réseau est enlisé et vous voyez TCP windowing (je crois que c'est le terme exact) limitant essentiellement votre bande passante.

1

Monsieur amischiefr a raison! C'est le même problème que sur l'autre thread. Mon problème a été résolu en remplaçant DataXXXputStream par BufferedXXXputstream. Les méthodes write (byte [], off, len) sont identiques et le document ne parle pas d'un comportement aussi différent. DataOutputStream est mis en mémoire tampon, BufferedOutputStream aussi, mais le second le fait beaucoup mieux. Merci!