📄 ftpserver.java
字号:
return false;
}//commandRETR() end
boolean commandSTOR()
{
if(param.equals(""))
{
reply = "501 Syntax error in parameters or arguments";
return false;
}
requestfile = addTail(dir)+param;
if(type == FtpState.FTYPE_IMAGE)
{
try
{
out.println("150 Opening Binary mode data connection for "+ requestfile);
dsocket = new Socket(remoteHost,remotePort,InetAddress.getLocalHost(),20);
BufferedOutputStream fout = new BufferedOutputStream(new FileOutputStream(requestfile));
BufferedInputStream din = new BufferedInputStream(dsocket.getInputStream());
byte[] buf = new byte[1024];
int l = 0;
while((l = din.read(buf,0,1024))!=-1)
{
fout.write(buf,0,l);
}//while()
din.close();
fout.close();
dsocket.close();
reply = "226 Transfer complete !";
}
catch(Exception e)
{
e.printStackTrace();
reply = "451 Requested action aborted: local error in processing";
return false;
}
}
if(type == FtpState.FTYPE_ASCII)
{
try
{
out.println("150 Opening ASCII mode data connection for "+ requestfile);
dsocket = new Socket(remoteHost,remotePort,InetAddress.getLocalHost(),20);
PrintWriter fout = new PrintWriter(new FileOutputStream(requestfile));
BufferedReader din = new BufferedReader(new InputStreamReader(dsocket.getInputStream()));
String line;
while((line = din.readLine())!=null)
{
fout.println(line);
}
din.close();
fout.close();
dsocket.close();
reply = " 226 Transfer complete !";
}
catch(Exception e)
{
e.printStackTrace();
reply = "451 Requested action aborted: local error in processing";
return false;
}
}
return false;
}//commandSTOR() end
boolean commandPWD()
{
reply = "257 " + dir + " is current directory.";
return false;
}//commandPWD() end
boolean commandNOOP()
{
reply = "200 OK.";
return false;
}//commandNOOP() end
boolean commandABOR()
{
try
{
dsocket.close();
}
catch(Exception e)
{
e.printStackTrace();
reply = "451 Requested action aborted: local error in processing";
return false;
}
reply = "421 Service not available, closing control connection";
return false;
}//commandABOR() end
boolean commandDELE()
{
int i = validatePath(param);
if(i == 0)
{
reply = "550 Request action not taken";
return false;
}
if(i == 1)
{
File f = new File(param);
f.delete();
}
if(i == 2)
{
File f= new File(addTail(dir)+param);
f.delete();
}
reply = "250 Request file action ok,complete";
return false;
}//commandDELE() end
boolean commandMKD()
{
String s1 = param.toLowerCase();
String s2 = rootdir.toLowerCase();
if(s1.startsWith(s2))
{
File f = new File(param);
if(f.exists())
{
reply = "550 Request action not taken";
return false;
}
else
{
f.mkdirs();
reply = "250 Request file action ok,complete";
}
}
else
{
File f = new File(addTail(dir)+param);
if(f.exists())
{
reply = "550 Request action not taken";
return false;
}
else
{
f.mkdirs();
reply = "250 Request file action ok,complete";
}
}
return false;
}//commandMKD() end
String addTail(String s)
{
if(!s.endsWith("/"))
s = s + "/";
return s;
}
public FtpHandler(Socket s,int i)
{
csocket = s;
id = i;
}
public void run()
{
String str = "";
int parseResult;
try
{
BufferedReader in = new BufferedReader
(new InputStreamReader(csocket.getInputStream()));
out = new PrintWriter
(csocket.getOutputStream(),true);
state = FtpState.FS_WAIT_LOGIN;
boolean finished = false;
while(!finished)
{
str = in.readLine();
if(str == null) finished = true;
else
{
parseResult = parseInput(str);
System.out.println("Command:"+cmd+" Parameter:"+param);
System.out.print("->");
switch(state)
{
case FtpState.FS_WAIT_LOGIN:
finished = commandUSER();
break;
case FtpState.FS_WAIT_PASS:
finished = commandPASS();
break;
case FtpState.FS_LOGIN:
{
switch(parseResult)
{
case -1:
errCMD();
break;
case 4:
finished = commandCDUP();
break;
case 6:
finished = commandCWD();
break;
case 7:
finished = commandQUIT();
break;
case 9:
finished = commandPORT();
break;
case 27:
finished = commandLIST();
break;
case 11:
finished = commandTYPE();
break;
case 14:
finished = commandRETR();
break;
case 15:
finished = commandSTOR();
break;
case 26:
case 33:
finished = commandPWD();
break;
case 32:
finished = commandNOOP();
break;
case 22:
finished = commandABOR();
break;
case 23:
finished = commandDELE();
break;
case 25:
finished = commandMKD();
break;
}// switch(parseResult) end
}// case FtpState.FS_LOGIN: end
break;
}// switch(state) end
} // else
out.println(reply);
} //while
csocket.close();
} //try
catch(Exception e)
{
e.printStackTrace();
}
}
}
class FtpConsole extends Thread
{
BufferedReader cin;
String conCmd;
String conParam;
int consoleQUIT()
{
System.exit(0);
return 0;
}//consoleQUIT() end
boolean consoleLISTUSER()
{
System.out.println("username \t\t workdirectory");
for(int i = 0 ; i<FtpServer.usersInfo.size();i++)
{
System.out.println(((UserInfo)FtpServer.usersInfo.get(i)).user+" \t\t\t "+((UserInfo)FtpServer.usersInfo.get(i)).workDir);
}
return false;
}//consoleLISTUSER() end
boolean consoleLIST()
{
int i = 0;
for(i=0;i<FtpServer.users.size();i++)
{
System.out.println((i+1)+":"+((FtpHandler)(FtpServer.users.get(i))).user + " From " +((FtpHandler)(FtpServer.users.get(i))).csocket.getInetAddress().toString());
}
return false;
}//consoleLIST() end
boolean validateUserName(String s)
{
for(int i = 0 ; i<FtpServer.usersInfo.size();i++)
{
if(((UserInfo)FtpServer.usersInfo.get(i)).user.equals(s))
return false;
}
return true;
}//validateUserName() end
boolean consoleADDUSER()
{
System.out.print("please enter username:");
try
{
cin = new BufferedReader(new InputStreamReader(System.in));
UserInfo tempUserInfo = new UserInfo();
String line = cin.readLine();
if(line != "")
{
if(!validateUserName(line))
{
System.out.println("user "+line+" already exists!");
return false;
}
}
else
{
System.out.println("username cannot be null!");
return false;
}
tempUserInfo.user = line;
System.out.print("enter password :");
line = cin.readLine();
if(line != "")
tempUserInfo.password = line;
else
{
System.out.println("password cannot be null!");
return false;
}
System.out.print("enter the initial directory: ");
line = cin.readLine();
if(line != "")
{
File f = new File(line);
if(!f.exists())
f.mkdirs();
tempUserInfo.workDir = line;
}
else
{
System.out.println("the directory cannot be null!");
return false;
}
FtpServer.usersInfo.add(tempUserInfo);
saveUserInfo();
}
catch(Exception e)
{
e.printStackTrace();
return false;
}
return false;
}//consoleADDUSER() end
void saveUserInfo()
{
String s = "";
try
{
BufferedWriter fout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("user.cfg")));
for(int i = 0; i < FtpServer.usersInfo.size();i++)
{
s = ((UserInfo)FtpServer.usersInfo.get(i)).user+"|"+((UserInfo)FtpServer.usersInfo.get(i)).password+"|"+((UserInfo)FtpServer.usersInfo.get(i)).workDir+"|";
fout.write(s);
fout.newLine();
}
fout.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}//saveUserInfo() end
boolean consoleDELUSER()
{
String s = "";
//System.out.println(conParam);
if(conParam.equals(""))
{
System.out.println("usage:deluser username");
return false;
}
for(int i=0;i<FtpServer.usersInfo.size();i++)
{
s = ((UserInfo)FtpServer.usersInfo.get(i)).user;
if(s.equals(conParam))
{
System.out.println("User "+conParam+" deleted");
FtpServer.usersInfo.remove(i);
saveUserInfo();
return false;
}
}
System.out.println("User "+conParam+" not exists");
return false;
}//consoleDELUSER() end
boolean consoleHELP()
{
if(conParam.equals(""))
{
System.out.println("adduser :add new user");
System.out.println("deluser <username> :delete a user");
System.out.println("quit :quit");
System.out.println("list :list all user connect to server");
System.out.println("listuser : list all account of this server");
System.out.println("help :show this help");
}
else if(conParam.equals("adduser"))
System.out.println("adduser :add new user");
else if(conParam.equals("deluser"))
System.out.println("deluser <username> :delete a user");
else if(conParam.equals("quit"))
System.out.println("quit :quit");
else if(conParam.equals("list"))
System.out.println("list :list all user connect to server");
else if(conParam.equals("listuser"))
System.out.println("listuser : list all account of this server");
else if(conParam.equals("help"))
System.out.println("help :show this help");
else
return false;
return false;
}//consoleHELP() end
boolean consoleERR()
{
System.out.println("bad command!");
return false;
}//consoleERR() end
public FtpConsole()
{
System.out.println("ftp server started!");
cin = new BufferedReader(new InputStreamReader(System.in));
}
public void run()
{
boolean ok = false;
String input = "";
while(!ok)
{
System.out.print("->");
try
{
input = cin.readLine();
}
catch(Exception e)
{
e.printStackTrace();
}
switch(parseInput(input))
{
case 1:
consoleQUIT();
break;
case 8:
ok = consoleLISTUSER();
break;
case 0:
ok = consoleLIST();
break;
case 2:
ok = consoleADDUSER();
break;
case 3:
ok = consoleDELUSER();
break;
case 7:
ok = consoleHELP();
break;
case -1:
ok = consoleERR();
break;
}
}//while end
//
}// run() end
int parseInput(String s)
{
String upperCmd;
int p = 0;
conCmd = "";
conParam = "";
p = s.indexOf(" ");
if(p == -1)
conCmd = s;
else
conCmd = s.substring(0,p);
if(p >= s.length() || p ==-1)
conParam = "";
else
conParam = s.substring(p+1,s.length());
upperCmd = conCmd.toUpperCase();
if(upperCmd.equals("LIST"))
return 0;
else if(upperCmd.equals("QUIT")||upperCmd.equals("EXIT"))
return 1;
else if(upperCmd.equals("ADDUSER"))
return 2;
else if(upperCmd.equals("DELUSER"))
return 3;
else if(upperCmd.equals("EDITUSER"))
return 4;
else if(upperCmd.equals("ADDDIR"))
return 5;
else if(upperCmd.equals("REMOVEDIR"))
return 6;
else if(upperCmd.equals("HELP") ||upperCmd.equals("?"))
return 7;
else if(upperCmd.equals("LISTUSER"))
return 8;
return -1;
}// parseInput end
}
class FtpState
{
final static int FS_WAIT_LOGIN = 0;
final static int FS_WAIT_PASS = 1;
final static int FS_LOGIN = 2;
final static int FTYPE_ASCII = 0;
final static int FTYPE_IMAGE = 1;
final static int FMODE_STREAM = 0;
final static int FMODE_COMPRESSED = 1;
final static int FSTRU_FILE = 0;
final static int FSTRU_PAGE = 1;
}
class UserInfo
{
String user;
String password;
String workDir;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -