📄 ftpserver.java
字号:
}
else
reply = "504 命令不能执行这种参数";
return false;
}
//connamdRETR 方法
//从服务器中获得文件
boolean commandRETR()
{
requestfile = param;
File f = new File(requestfile);
if(!f.exists())
{
f = new File(addTail(dir)+param);
if(!f.exists())
{
reply = "550 文件不存在";
return false;
}
requestfile = addTail(dir)+param;
}
if(isrest)
{
}
else
{
if(type==FtpState.FTYPE_IMAGE) //bin
{
try
{
ctrlOutput.println("150 文件状态正常,以二进治方式打开文件: "+ requestfile);
dataSocket = new Socket(remoteHost,remotePort,InetAddress.getLocalHost(),20);
BufferedInputStream fin = new BufferedInputStream(new FileInputStream(requestfile));
PrintStream dataOutput = new PrintStream(dataSocket.getOutputStream(),true);
byte[] buf = new byte[1024]; //目标缓冲区
int l = 0;
while((l=fin.read(buf,0,1024))!=-1) //缓冲区未读满
{
dataOutput.write(buf,0,l); //写入套接字
}
fin.close();
dataOutput.close();
dataSocket.close();
reply ="226 传输数据连接结束";
}
catch(Exception e)
{
e.printStackTrace();
reply = "451 请求失败: 传输出故障";
return false;
}
}
if(type==FtpState.FTYPE_ASCII)//ascII
{
try
{
ctrlOutput.println("150 Opening ASCII mode data connection for "+ requestfile);
dataSocket = new Socket(remoteHost,remotePort,InetAddress.getLocalHost(),20);
BufferedReader fin = new BufferedReader(new FileReader(requestfile));
PrintWriter dataOutput = new PrintWriter(dataSocket.getOutputStream(),true);
String s;
while((s=fin.readLine())!=null)
{
dataOutput.println(s); ///???
}
fin.close();
dataOutput.close();
dataSocket.close();
reply ="226 传输数据连接结束";
}
catch(Exception e)
{
e.printStackTrace();
reply = "451 请求失败: 传输出故障";
return false;
}
}
}
return false;
}
//commandSTOR 方法
//向服务器中发送文件STOR
boolean commandSTOR()
{
if(param.equals(""))
{
reply = "501 参数语法错误";
return false;
}
requestfile = addTail(dir)+param;
if(type == FtpState.FTYPE_IMAGE)//bin
{
try
{
ctrlOutput.println("150 Opening Binary mode data connection for "+ requestfile);
dataSocket = new Socket(remoteHost,remotePort,InetAddress.getLocalHost(),20);
BufferedOutputStream fout = new BufferedOutputStream(new FileOutputStream(requestfile));
BufferedInputStream dataInput = new BufferedInputStream(dataSocket.getInputStream());
byte[] buf = new byte[1024];
int l = 0;
while((l = dataInput.read(buf,0,1024))!=-1)
{
fout.write(buf,0,l);
}
dataInput.close();
fout.close();
dataSocket.close();
reply = "226 传输数据连接结束";
}
catch(Exception e)
{
e.printStackTrace();
reply = "451 请求失败: 传输出故障";
return false;
}
}
if(type == FtpState.FTYPE_ASCII)//ascII
{
try
{
ctrlOutput.println("150 Opening ASCII mode data connection for "+ requestfile);
dataSocket = new Socket(remoteHost,remotePort,InetAddress.getLocalHost(),20);
PrintWriter fout = new PrintWriter(new FileOutputStream(requestfile));
BufferedReader dataInput = new BufferedReader(new InputStreamReader(dataSocket.getInputStream()));
String line;
while((line = dataInput.readLine())!=null)
{
fout.println(line);
}
dataInput.close();
fout.close();
dataSocket.close();
reply = "226 传输数据连接结束";
}
catch(Exception e)
{
e.printStackTrace();
reply = "451 请求失败: 传输出故障";
return false;
}
}
return false;
}
boolean commandPWD()
{
reply = "257 " + dir + " 是当前目录.";
return false;
}
boolean commandNOOP()
{
reply = "200 命令正确.";
return false;
}
//强关dataSocket 流
boolean commandABOR()
{
try
{
dataSocket.close();
}
catch(Exception e)
{
e.printStackTrace();
reply = "451 请求失败: 传输出故障";
return false;
}
reply = "421 服务不可用, 关闭数据传送连接";
return false;
}
//删除服务器上的指定文件
boolean commandDELE()
{
int i = validatePath(param);
if(i == 0)
{
reply = "550 请求的动作未执行,文件不存在,或目录不对,或其他";
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 请求的文件处理结束,成功删除服务器上文件";
return false;
}
//建立目录,要绝对路径
boolean commandMKD()
{
String s1 = param.toLowerCase();
String s2 = rootdir.toLowerCase();
if(s1.startsWith(s2))
{
File f = new File(param);
if(f.exists())
{
reply = "550 请求的动作未执行,目录已存在";
return false;
}
else
{
f.mkdirs();
reply = "250 请求的文件处理结束, 目录建立";
}
}
else
{
File f = new File(addTail(dir)+param);
if(f.exists())
{
reply = "550 请求的动作未执行,目录已存在";
return false;
}
else
{
f.mkdirs();
reply = "250 请求的文件处理结束, 目录建立";
}
}
return false;
}
String addTail(String s)
{
if(!s.endsWith("/"))
s = s + "/";
return s;
}
}
/********************************************************************************/
/* FTP 控制台(用于服务器管理员,对于最简单的FTP没的也可以) ***/
/********************************************************************************/
class FtpConsole extends Thread
{
BufferedReader cin; //
String conCmd; //命令
String conParam; //参数
///
public FtpConsole()
{
System.out.println("ftp 服务器启动!");
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(); //列出活动,及其IP
break;
case 2:
ok = consoleADDUSER(); //增加一个注册用户
break;
case 3:
ok = consoleDELUSER(); //删除一个注册用户
break;
case 7:
ok = consoleHELP(); //显示帮助信息
break;
case -1:
ok = consoleERR(); //错误命令
break;
}
}
}
//退出
int consoleQUIT()
{
System.exit(0);
return 0;
}
//列出所有注册用户及其工作目录
boolean consoleLISTUSER()
{
System.out.println("用户名 \t\t 工作目录");
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;
}
//列出活动用户,及其IP
boolean consoleLIST()
{
int i = 0;
for(i=0;i<FtpServer.users.size();i++)
{
System.out.println((i+1)+":"+((FtpHandler)(FtpServer.users.get(i))).user
+ " 来自于 "
+((FtpHandler)(FtpServer.users.get(i))).ctrlSocket.getInetAddress().toString());
}
return false;
}
//判断是否已经注册了
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;
}
//增加一个注册用户
boolean consoleADDUSER()
{
System.out.print("请键入用户 :");
try
{
cin = new BufferedReader(new InputStreamReader(System.in));
UserInfo tempUserInfo = new UserInfo();
String line = cin.readLine();
if(line != "")
{
if(!validateUserName(line))//已存在这个用户
{
System.out.println("用户名 "+line+" 已注册!");
return false;
}
}
else
{
System.out.println("用户名不能为空 !");
return false;
}
tempUserInfo.user = line;
System.out.print("请键入密码 :");
line = cin.readLine();
if(line != "")
tempUserInfo.password = line;
else
{
System.out.println("密码不能为空 !");
return false;
}
System.out.print("输入用户主目录 : ");
line = cin.readLine();
if(line != "")
{
File f = new File(line);
if(!f.exists())
f.mkdirs();
tempUserInfo.workDir = line;
}
else
{
System.out.println("主目录不能为空 !");
return false;
}
FtpServer.usersInfo.add(tempUserInfo);
saveUserInfo();
}
catch(Exception e)
{
e.printStackTrace();
return false;
}
return false;
}
//
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();
}
}
//删除一个注册用户
boolean consoleDELUSER()
{
String s = "";
if(conParam.equals(""))
{
System.out.println("用法:deluser 用户名");
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("用户注册信息 "+conParam+" 已删除");
FtpServer.usersInfo.remove(i);
saveUserInfo();
return false;
}
}
System.out.println("用户 "+conParam+" 不存在");
return false;
}
///
boolean consoleHELP()
{
if(conParam.equals(""))
{
System.out.println("adduser :增加一个注册用户");
System.out.println("deluser <username> :删除一个注册用户");
System.out.println("quit :退出");
System.out.println("list :列出活动用户,及其IP");
System.out.println("listuser : 列出所有注册用户及其工作目录");
System.out.println("help :显示 帮助信息");
}
else if(conParam.equals("adduser"))
System.out.println("adduser :增加一个注册用户");
else if(conParam.equals("deluser"))
System.out.println("deluser <username> :删除一个注册用户");
else if(conParam.equals("quit"))
System.out.println("quit :退出");
else if(conParam.equals("list"))
System.out.println("list :列出活动用户,及其IP");
else if(conParam.equals("listuser"))
System.out.println("listuser : 列出所有注册用户及其工作目录");
else if(conParam.equals("help"))
System.out.println("help :显示 帮助信息");
else
return false;
return false;
}
boolean consoleERR()
{
System.out.println("错误命令!");
return false;
}
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);//返回子串,0 ~ p-1 */
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;
}
}
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
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 + -