/* * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
try {
in = new BufferedReader(new InputStreamReader(
client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
out.println("220 tatooine FTP server (SunOS 5.8) ready.");
} catch (Exception ex) { return;
} while (!done) { try {
str = in.readLine();
res = parseCmd(str); if ((res > PASS && res != QUIT) && !logged) {
out.println("530 Not logged in."); continue;
} switch (res) { case ERROR:
out.println("500 '" + str + "': command not understood."); break; case USER: if (!logged && !waitpass) {
out.println("331 Password required for " + arg);
waitpass = true;
} else {
out.println("503 Bad sequence of commands.");
} break; case PASS: if (!logged && waitpass) {
out.println("230-Welcome to the FTP server!");
out.println("ab");
out.println("230 Guest login ok, " + "access restrictions apply.");
logged = true;
waitpass = false;
} else
out.println("503 Bad sequence of commands."); break; case QUIT:
out.println("221 Goodbye.");
out.flush();
out.close(); if (pasv != null)
pasv.close();
done = true; break; case TYPE:
out.println("200 Type set to " + arg + "."); break; case CWD:
out.println("250 CWD command successful."); break; case EPSV: if (!extendedEnabled || !pasvEnabled) {
out.println("500 EPSV is disabled, " + "use PORT instead."); continue;
} if ("all".equalsIgnoreCase(arg)) {
out.println("200 EPSV ALL command successful."); continue;
} try { if (pasv == null) {
pasv = new ServerSocket();
pasv.bind(new InetSocketAddress(server.getInetAddress(), 0));
} int port = pasv.getLocalPort();
out.println("229 Entering Extended" + " Passive Mode (|||" + port + "|)");
} catch (IOException ssex) {
out.println("425 Can't build data connection:" + " Connection refused.");
} break;
case PASV: if (!pasvEnabled) {
out.println("500 PASV is disabled, " + "use PORT instead."); continue;
} try { if (pasv == null) {
pasv = new ServerSocket();
pasv.bind(new InetSocketAddress("127.0.0.1", 0));
} int port = pasv.getLocalPort();
// Parenthesis are optional, so let's be // nasty and don't put them
out.println("227 Entering Passive Mode" + " 127,0,0,1," +
(port >> 8) + "," + (port & 0xff));
} catch (IOException ssex) {
out.println("425 Can't build data connection:" + "Connection refused.");
} break; case PORT: if (!portEnabled) {
out.println("500 PORT is disabled, " + "use PASV instead"); continue;
}
StringBuffer host; int i = 0, j = 4; while (j > 0) {
i = arg.indexOf(',', i + 1); if (i < 0) break;
j--;
} if (j != 0) {
out.println("500 '" + arg + "':" + " command not understood."); continue;
} try {
host = new StringBuffer(arg.substring(0, i)); for (j = 0; j < host.length(); j++) if (host.charAt(j) == ',')
host.setCharAt(j, '.');
String ports = arg.substring(i+1);
i = ports.indexOf(',');
data_port = Integer.parseInt(
ports.substring(0, i)) << 8;
data_port += (Integer.parseInt(
ports.substring(i+1)));
data_addr = InetAddress.getByName(
host.toString());
out.println("200 Command okay.");
} catch (Exception ex3) {
data_port = 0;
data_addr = null;
out.println("500 '" + arg + "':" + " command not understood.");
} break; case RETR:
{
File file = new File(arg); if (!file.exists()) {
System.out.println("File not found");
out.println("200 Command okay.");
out.println("550 '" + arg + "' No such file or directory."); break;
}
FileInputStream fin = new FileInputStream(file);
OutputStream dout = getOutDataStream(); if (dout != null) {
out.println("150 Binary data connection" + " for " + arg + " (" + client.getInetAddress().
getHostAddress() + ") (" +
file.length() + " bytes)."); int c; int len = 0; while ((c = fin.read()) != -1) {
dout.write(c);
len++;
}
dout.flush();
dout.close();
fin.close();
out.println("226 Binary Transfer complete.");
} else {
out.println("425 Can't build data" + " connection: Connection refused.");
}
} break;
}
} catch (IOException ioe) {
ioe.printStackTrace(); try {
out.close();
} catch (Exception ex2) {
}
done = true;
}
}
}
}
public FtpServer(int port) { this(InetAddress.getLoopbackAddress(), port);
}
public FtpServer(InetAddress address, int port) { try { if (address == null) {
server = new ServerSocket(port);
} else {
server = new ServerSocket();
server.bind(new InetSocketAddress(address, port));
}
} catch (IOException e) { thrownew UncheckedIOException(e);
}
}
/** * A way to tell the server that it can stop.
*/ synchronizedpublicvoid terminate() {
done = true;
}
/* * All we got to do here is create a ServerSocket and wait for a * connection. When a connection happens, we just have to create * a thread that will handle it.
*/ publicvoid run() { try {
System.out.println("FTP server waiting for connections at: "
+ server.getLocalSocketAddress());
Socket client;
client = server.accept();
(new FtpServerHandler(client)).start();
server.close();
} catch (Exception e) {
}
}
}
public MarkResetTest() {
FtpServer server = null; try {
server = new FtpServer(0);
server.start(); int port = 0; while (port == 0) { Thread.sleep(500);
port = server.getPort();
}
/** * guessContentTypeFromStream method calls mark and reset methods * on the given stream. Make sure that calling * guessContentTypeFromStream repeatedly does not affect * reading from the stream afterwards
*/
System.out.println("Call GuessContentTypeFromStream()" + " several times.."); for (int i = 0; i < 5; i++) {
System.out.println((i + 1) + " mime-type: " +
con.guessContentTypeFromStream(is));
}
int len = 0; int c; while ((c = is.read()) != -1) {
len++;
}
is.close();
System.out.println("read: " + len + " bytes of the file");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.