www.pudn.com > kftpserver.zip > kftpserver.java
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
public class KFtpd extends Thread
{
static SimpleDateFormat df;
private static String root;
static int pPort=240*256;
public static void main(String[] args){
df=new SimpleDateFormat("MMM dd hh:mm",Locale.US);
if(args.length != 0)root = args[0];
else root = "/C:/";
int i = 0;
System.out.println("BW-FTP Server V0.2 is Ready..");
try{
ServerSocket s = new ServerSocket(21);
for(;;){
Socket incoming = s.accept();
new KFtpd(incoming,++i).start();
}
}catch(Exception e){}
}
private Socket incoming,dt;
private int counter;
public KFtpd(Socket income, int c){ incoming = income; counter = c; }
public void run(){
int lng,lng1,lng2,i,ip1,ip2,ip = 1,h1;
String a1,a2,di,str1,user="",host;
InetAddress inet;
InetAddress localip;
long skip=0;
String dir,comm,param;
boolean passive=false;
dir = root;
try{
inet = incoming.getInetAddress();
localip = inet.getLocalHost();
host = inet.toString();
h1 = host.indexOf("/");
host = host.substring(h1 + 1);
BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
PrintWriter out = new PrintWriter(incoming.getOutputStream(),true);
out.println("220 K-FTP server V0.2 [JAVA FTP server written by Byung-Wook Kang]ready.");
boolean done = false;
while(!done){
a1 = "";
a2 = "";
System.out.print("<"+counter+"> "+dir+" : ");
String str = in.readLine();
if(str==null)break;
System.out.println(str);
if(str.length()>4){
comm=str.substring(0,4).trim().toUpperCase();
param = str.substring(4).trim();}
else{comm=str.toUpperCase();param="";}
if(comm.equals("REST")){
skip=Long.parseLong(param);
out.println("350 Restart begun at "+param+".");
}
else if(comm.equals("PASV")){
if(!passive){
passive=true;
}else{
pPort=dt.getLocalPort()+1;
System.out.println(pPort+" "+dt.getPort());
}
out.println("227 Entering Passive mode ("
+localip.getHostAddress().replace('.',',')+","+(pPort/256)+","+(pPort%256)+")" );
try{
dt = new ServerSocket(pPort).accept();
}catch(Exception e){pPort++;}
}
else if(comm.equals("SIZE")){
File f;
if(param.startsWith("/"))f=new File(root,param);
else f=new File(dir,param);
if(f.exists())out.println("213 "+f.length());
else out.println("550 "+f.getName()+": no such file or directory");
}
else if(comm.equals("RETR")){
File f;
if(param.startsWith("/")){
f=new File(root,param);
System.out.println("Sending : "+root+param);
}
else {
f=new File(dir,param);
System.out.println("Sending : "+dir+"/"+param);
}
if(f.exists()){
out.print("150 Opening data connection for "+param);
out.println(" ("+f.length()+" bytes).");
FileInputStream outFile=new FileInputStream(f);
Socket t;
if(!passive)t = new Socket(host,ip);else t=dt;
OutputStream out2=t.getOutputStream();
byte bb[] = new byte[4096];
int amount;
try{
outFile.skip(skip);
while((amount = outFile.read(bb)) != -1){
out2.write(bb, 0, amount);
}
out2.close();
outFile.close();
t.close();
out.println("226 transfer complete.");
}
catch(IOException e){if(passive)pPort++;}
skip=0;
}
else out.println("550 "+f.getName()+": no such file or directory");
}
else if(comm.equals("STOR")){
System.out.println("Receiving : "+dir+"/"+param);
out.println("150 Opening data connection for "+param);
FileOutputStream inFile=new FileOutputStream(new File(dir,param));
Socket t = new Socket(host,ip);
InputStream in2
= t.getInputStream();
byte bb[] = new byte[4096];
int amount;
try{
while((amount = in2.read(bb)) != -1){
inFile.write(bb, 0, amount);
}
in2.close();
inFile.close();
t.close();
out.println("226 transfer complete");
}
catch(Exception e){System.out.println(e);}
}
else if(comm.equals("APPE")){
System.out.println("Receiving : "+dir+"/"+param);
out.println("150 Opening data connection for "+param);
RandomAccessFile inFile = new
RandomAccessFile(dir+"/"+param,"rw");
inFile.seek(inFile.length());
Socket t = new Socket(host,ip);
InputStream in2
= t.getInputStream();
byte bb[] = new byte[4096];
int amount;
try{
while((amount = in2.read(bb)) != -1){
inFile.write(bb, 0, amount);
}
in2.close();
inFile.close();
t.close();
out.println("226 transfer complete");
}
catch(Exception e){System.out.println(e);}
}
else if(comm.equals("TYPE")){
out.println("200 Type set to "+param+".");}
else if(comm.equals("NOOP")){
out.println("200 NOOP command successful.");}
else if(comm.equals("ABOR")){
out.println("200 ABOR command successful.");}
else if(comm.equals("DELE")){
File f = new File(dir,param);
boolean del = f.delete();
out.println("250 delete command successful");}
else if(comm.equals("CDUP")){
if(!dir.endsWith(":/")){
int n = dir.lastIndexOf("/");
dir = dir.substring(0,n);
if(dir.endsWith(":"))dir+="/";
}
out.println("250 CWD command succesful");
}
else if(comm.equals("CWD")){
if(param.equals("/"))dir=root;
else if(param.startsWith("/")){
if(param.indexOf(":")==2){
dir=param;
if(dir.endsWith(":"))dir+="/";
}
else dir=root+param;
}
else{
if(dir.endsWith("/"))dir += param;
else dir += "/"+param;
}
out.println("250 CWD command succesful");
}
else if(comm.equals("QUIT")) {
out.println("GOOD BYE");
done = true; }
else if(comm.equals("USER")){
user = param;
out.println("331 Password");}
else if(comm.equals("PASS"))out.println("230 User "+user+" logged in.");
else if(comm.equals("PWD")){
out.println("257 \""+dir+"\" is current directory.");
}
else if(comm.equals("SYS")) out.println("500 SYS not understood");
else if(comm.equals("PORT")) {
out.println("200 PORT command successful");
lng = str.length() - 1;
lng2 = str.lastIndexOf(",");
lng1 = str.lastIndexOf(",",lng2-1);
for(i=lng1+1;i