Technaton
24-05-2005, 13:12
Hallo,
das ganze hier ist vielleicht trivial, aber für mich gerade unlösbar.
Ich habe mir ein Programm geschrieben, daß ein ftp-Objekt erzeugt (von den Jakarta-Commons), und danach zwei Threads aufruft: Erstens einer, der 8 Sekunden schläft, dann aufwacht und ein NOOP sendet, damit die Verbindung nicht abbricht; und zweitens einer, der von System.in liest und das als Kommando an die FTP-Verbindung übermittelt.
Ohne synchronized habe ich logischerweise das Problem, daß der NOOP-Thread eine Operation unterbrechen kann, z.B. ein Verzeichnislisting. Also habe ich die entsprechenden Bereich umbaut und
synchronized(ftp) { ... } drumherumgesetzt. Jetzt habe ich das Problem, daß keines der umbauten Bereiche mehr ausgeführt wird, als würden beide darauf warten, daß der Monitor frei wird, obwohl keiner wirklich drin ist.
Das Programm macht folgendes:
CONNECT
220-FTP server ready.
220 This is a private system - No anonymous login
LOGIN
230-User blah has group access to: nobody
230 OK. Current restricted directory is /
NOOP
Das noop an sich wird aber nichtmehr ausgeführt. Weiß jemand, warum? :(
Mein Programm:
/*
* Created on 24.05.2005
*/
package testing;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.commons.net.ftp.FTPClient;
public class Ftptest extends Thread {
private static String server = "xy";
private static int port = 21;
private static String user = "blah";
private static String pass = "blubb";
private static FTPClient ftp = new FTPClient();
private static BufferedReader br;
private static int reply;
private static final int LIST = 0;
static class InputListener extends Thread {
public InputListener( ) {
br =
new BufferedReader(
new InputStreamReader(System.in)
);
}
public void run() {
while(!isInterrupted()) { try {
if(ftp.isConnected()) {
String s = br.readLine();
if(s != null && !s.equals("") && !s.equals("\\n")) {
System.out.println("========== "+s+" ==========");
synchronized(ftp) {
if(s.compareToIgnoreCase("LIST") == 0) {
for(int i =0; i< ftp.listNames().length;++i)
System.out.println(s+": "+ftp.listNames()[i]);
} else { ftp.sendCommand(s);
for(int i = 0; i < ftp.getReplyStrings().length;i++)
System.out.println(s+": "+ftp.getReplyStrings()[i]);
}
ftp.notify();
}
}
}
} catch (Exception e) {
System.err.println(e.toString());
} }
}
}
static class FtpListener extends Thread {
public void run() {
while(!isInterrupted() && isAlive()) {
try {
if(!ftp.isConnected()) {
System.out.println("CONNECT");
ftp.connect(server,port);
System.out.println(ftp.getReplyString());
System.out.println("LOGIN");
ftp.login(user,pass);
System.out.println(ftp.getReplyString());
}
synchronized(ftp) {
System.out.println("NOOP");
ftp.sendNoOp();
System.out.println(ftp.getReplyString());
ftp.notify();
}
sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
try {
ftp.logout();
ftp.disconnect();
} catch (IOException ex) {
// nothing. We just ensure that no connection keeps
// alive, bumping around somewhere.
}
} catch (IOException e) {
interrupt();
}
} }
}
public static void main (String[] args) {
try {
FtpListener in = new FtpListener();
//in.setDaemon(true);
in.start();
Ftptest.InputListener inlistener = new InputListener();
inlistener.start();
in.join();
inlistener.join();
} catch (Exception e) {
e.printStackTrace();
}
}
}
das ganze hier ist vielleicht trivial, aber für mich gerade unlösbar.
Ich habe mir ein Programm geschrieben, daß ein ftp-Objekt erzeugt (von den Jakarta-Commons), und danach zwei Threads aufruft: Erstens einer, der 8 Sekunden schläft, dann aufwacht und ein NOOP sendet, damit die Verbindung nicht abbricht; und zweitens einer, der von System.in liest und das als Kommando an die FTP-Verbindung übermittelt.
Ohne synchronized habe ich logischerweise das Problem, daß der NOOP-Thread eine Operation unterbrechen kann, z.B. ein Verzeichnislisting. Also habe ich die entsprechenden Bereich umbaut und
synchronized(ftp) { ... } drumherumgesetzt. Jetzt habe ich das Problem, daß keines der umbauten Bereiche mehr ausgeführt wird, als würden beide darauf warten, daß der Monitor frei wird, obwohl keiner wirklich drin ist.
Das Programm macht folgendes:
CONNECT
220-FTP server ready.
220 This is a private system - No anonymous login
LOGIN
230-User blah has group access to: nobody
230 OK. Current restricted directory is /
NOOP
Das noop an sich wird aber nichtmehr ausgeführt. Weiß jemand, warum? :(
Mein Programm:
/*
* Created on 24.05.2005
*/
package testing;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.commons.net.ftp.FTPClient;
public class Ftptest extends Thread {
private static String server = "xy";
private static int port = 21;
private static String user = "blah";
private static String pass = "blubb";
private static FTPClient ftp = new FTPClient();
private static BufferedReader br;
private static int reply;
private static final int LIST = 0;
static class InputListener extends Thread {
public InputListener( ) {
br =
new BufferedReader(
new InputStreamReader(System.in)
);
}
public void run() {
while(!isInterrupted()) { try {
if(ftp.isConnected()) {
String s = br.readLine();
if(s != null && !s.equals("") && !s.equals("\\n")) {
System.out.println("========== "+s+" ==========");
synchronized(ftp) {
if(s.compareToIgnoreCase("LIST") == 0) {
for(int i =0; i< ftp.listNames().length;++i)
System.out.println(s+": "+ftp.listNames()[i]);
} else { ftp.sendCommand(s);
for(int i = 0; i < ftp.getReplyStrings().length;i++)
System.out.println(s+": "+ftp.getReplyStrings()[i]);
}
ftp.notify();
}
}
}
} catch (Exception e) {
System.err.println(e.toString());
} }
}
}
static class FtpListener extends Thread {
public void run() {
while(!isInterrupted() && isAlive()) {
try {
if(!ftp.isConnected()) {
System.out.println("CONNECT");
ftp.connect(server,port);
System.out.println(ftp.getReplyString());
System.out.println("LOGIN");
ftp.login(user,pass);
System.out.println(ftp.getReplyString());
}
synchronized(ftp) {
System.out.println("NOOP");
ftp.sendNoOp();
System.out.println(ftp.getReplyString());
ftp.notify();
}
sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
try {
ftp.logout();
ftp.disconnect();
} catch (IOException ex) {
// nothing. We just ensure that no connection keeps
// alive, bumping around somewhere.
}
} catch (IOException e) {
interrupt();
}
} }
}
public static void main (String[] args) {
try {
FtpListener in = new FtpListener();
//in.setDaemon(true);
in.start();
Ftptest.InputListener inlistener = new InputListener();
inlistener.start();
in.join();
inlistener.join();
} catch (Exception e) {
e.printStackTrace();
}
}
}