2

アプレットをクライアントとして、スタンドアロンのJavaアプリをサーバーとして(データセンターでホストされている専用マシン上で)、Javaでファイル転送アプリケーションを開発しようとしています。DataOutputStream/DataInputStream を使用して、両側でデータを転送します。大量のデータを送信すると、帯域幅は非常に変動します。最初はすべて問題ありませんが、何も転送されていない間に 40 ~ 50 秒間 TCP ストリームがフリーズし、その後再び開始します。

Ethereal で tcp ストリームを見ると、重複した ack、高速再送信、tcp 再送信が見られます。しかし、問題の原因が Java にあるとは思いません。FileZilla での FTP 転送にも同じ問題があります。しかし... netcat (netcat クライアント + netcat サーバー) を使用してデータを転送しようとすると、すべて問題なく、帯域幅は安定しており、転送されたボリュームに関係なく、tcp の失われたパケットは一時停止することなくすぐに再送信されるようです。

Java が netcat ほど tcp ストリームを操作する才能がなかったかのようです ...

Socket.setSendBufferSize() で遊んでみましたが、違いはわかりませんでした。何か案が ?

ありがとう !そして私の悪い英語でごめんなさい...

4

2 に答える 2

1

ミスター・ミスチーフは正しいです!他のスレッドと同じ問題です。私の問題は、DataXXXputStream を BufferedXXXputstream に置き換えることで解決しました。write(byte[], off, len) メソッドは同じであり、ドキュメントはそのような異なる動作について話していません。DataOutputStream はバッファリングされ、BufferedOutputStream もバッファリングされますが、2 番目の方がはるかに優れています。ありがとう !

于 2009-09-21T18:50:40.183 に答える
0

ネットワークが行き詰まり、TCP ウィンドウ (正しい用語だと思います) が基本的に帯域幅を制限しているように聞こえます。

于 2009-09-21T17:49:48.450 に答える