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

📄 ftpserver.java

📁 jbuilder应用开发程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
  		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 + -