私は現在、接続の速度を見るためのテストを実行するために、commons.netパッケージに基づいてftpクライアントを開発しています。 基本的に私のftpテストは、サーバーに接続してログオンし、必要なだけダウンロード/アップロードのサイクルを開始し、ユーザーがボタンを使って停止することを決定するまで、現在のサイクルは終了しますテスト。進行中のタスクをタイムアウトメカニズムで中断するにはどうすればいいですか?
しかし、これらのテストを実行しているときに、タイムアウトメカニズムを必要とする状況が発生しました。サーバーはファイルを送信していて、実際に完了する前に戻りコード226(転送完了)を送信していました。
私のスレッドは、それがもはや不可能なときにinputStreamを空にしようとしたままです。
私の考えは、ダウンロードプロセスでスレッドタイマーを開始することでした。これは、バイトがクライアントに転送されるたびにリセットされます。 タイムアウトが発生すると、例外が発生し、クライアントがダウンロードに対応して応答します。
私は多くのソリューションを読んでお試しください: - スレッドから例外を発生させる - >スレッドはクライアントではなく例外をキャッチします。 - スレッドからクライアントを中断するので、クライアントはinterruptedExceptionを発生させます - >動作していないようです。 - タイムアウトのエグゼキュータを使用する - >ダウンロードの「通常の」持続時間を知ることができないため、タスクを開始するときにエグゼキュータに与えることはできません。また、タイマーはリセットする必要があります。データを受信する。
私は多くのフォーラムでこれについて多くを読んでおり、この場合は適合して動作するように見える解決策は見つかりませんでした。誰かがそれを行う別の方法のアイデアを持っている場合は?
これは私が行っており、アクションのコードです:
public double get(String fileName) {
[...]
org.apache.commons.net.io.Util.copyStream(stO,stD,client.getBufferSize(),
this.localSize,
new org.apache.commons.net.io.CopyStreamAdapter() {
public void bytesTransferred(long totalBytesTransferred,
int bytesTransferred,long streamSize) {
setProgressDL(totalBytesTransferred);
//reset the timer here
}
});
[...]
}
をここでは私のクライアントを起動し、私のテストのコードの一部です:誰でも可能であれば
public class TestFtp extends Thread {
[...]
public void run() {
System.out.println("Launching FTP test");
FtpClient client = new FtpClient(this.model, this, this.model.getFtpServer());
try {
//Attempting connection on the server
client.connect();
try {
// Attempting login
client.login(this.model.getUsername(), this.model.getPassword());
do {
client.changeDirectory("get");
// start timer
client.get(this.model.getDistantFileName());
// stop timer
client.changeToParentDirectory();
client.changeDirectory("put");
client.set(this.model.getDistantFileName(),
this.model.getNewFileName());
client.changeToParentDirectory();
try {
// Little pause between each test
Thread.sleep(500);
} catch (InterruptedException e) {}
// Continue test until the user stops it
} while (this.continuous);
// Once the test is over, logout
client.logout();
} catch (FTPLoginException e) {
// If login fails, the test ends
System.out.println("Unable to login to the server.");
}
} catch (FTPConnectException e) {
// If connection error, the test ends
System.out.println("Unable to connect to the server.");
}
}
は事前によりありがとう私の実際のコードについてさらに詳しい情報が必要な場合は、ここにそれ以上の情報を入れることができます。
InputStream APIを直接使用していないと思われます。そうしないと、in.available()のようなことができますか?そうでない場合は、少し時間をおいてください。データがまだない場合は、接続が失われていると想定してください。 –
Thread.interrupt()はスレッドを中断し、途中にある貪欲コードがそれを食べていない限り、 –