⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftpserver.java

📁 实现FTP服务器与客户端的功能,主要解决得了同时上传数据时的冲突问题
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		}
		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 + -