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