FTP(ファイル転送プロトコルファイル転送プロトコル)は、インターネット上のファイルを転送するために使用されるプロトコルです。ファイルは、インターネット上のFTPサーバーからアップロード(アップロード)またはダウンロード(ダウンロード)できます。 FTPはリアルタイムのオンラインサービスです。使用する前に、サービスのユーザー(ユーザー名とパスワード)でなければなりません。作業中、クライアントは最初にサーバーであるコンピューターにログインする必要があります。ログインした後、ユーザーはファイル検索とファイル転送、および現在の作業ディレクトリの変更、列ファイルディレクトリの設定、送信パラメーター、転送ファイルなどのその他の関連操作を実行できます。FTPを使用して、テキストファイル、バイナリ実行可能ファイル、画像ファイル、サウンドファイル、データ圧縮ファイルなど、あらゆる種類のファイルを転送します。
FTPコマンド
FTPの主な操作は、さまざまなコマンドに基づいています。一般的に使用されるコマンドは次のとおりです。
ASCⅱ(テキスト)とバイナリバイナリモードを含む伝送モードを設定します。
ディレクトリ操作、リモートコンピューターの現在のディレクトリの変更または表示(CD、dir/lsコマンド);
接続操作、オープンコマンドは、リモートコンピューターとの接続を確立するために使用されます。 Closeコマンドは、接続を閉じるために使用されます。
操作を送信すると、Putコマンドはファイルをリモートコンピューターに転送するために使用されます。 Putコマンドは、複数のファイルをリモートコンピューターに転送するために使用されます。
操作を取得する、Getコマンドは1つのファイルを受信するために使用されます。 mggetコマンドは、複数のファイルを受信するために使用されます。
java.net.socketをインポートします。 org.apache.log4j.loggerをインポートします。 /**役割-Server A * @Author leon * */public class servera {public static void main(string [] args){final string f_dir = "c:/test"; // root path final int port = 22; //耳を傾けるポート番号logger.getRootlogger(); logger logger = logger.getLogger( "com"); try {Serversocket S = new Serversocket(port); logger.info( "サーバーA ..."); logger.info( "接続成功!ローカルポート:"+s.getlocalport()+"。デフォルトディレクトリ: '"+f_dir+"'。"); while(true){//クライアントリクエストSocket socket client = s.accept(); //サービススレッドの作成new ClientThread(client、f_dir).start(); }} catch(Exception E){logger.error(e.getMessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }}}} java.io.bufferedreaderをインポートします。 java.io.fileをインポートします。 java.io.filenotfoundexceptionをインポートします。 java.io.ioexceptionをインポートします。 java.io.inputStreamをインポートします。 java.io.inputStreamReaderをインポートします。 java.io.outputStreamをインポートします。 java.io.printwriterをインポートします。 java.io.randomaccessfileをインポートします。 java.net.connectexceptionをインポートします。 java.net.inetAddressをインポートします。 java.net.serversocketをインポートします。 java.net.socketをインポートします。 java.net.unknownhostexceptionをインポートします。 java.nio.charset.charsetをインポートします。 java.util.randomをインポートします。 org.apache.log4j.loggerをインポートします。 /** *クライアントサブスレッドクラス * @author leon * */public class clientthread extends thread {private socket socketclient; //クライアントソケットプライベートロガーロガー; //ログインオブジェクトプライベート文字列dir; //絶対パスプライベート文字列pdir = "// クライアント; this.dir = f_dir; } @Override public void run(){logger.getRootLogger(); logger = logger.getLogger( "com"); inputstream is = null; outputStream os = null; try {is = socketclient.getInputStream(); os = socketclient.getOutputStream(); } catch(ioException e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }} bufferedReader br = new BufferedReader(new inputStreamReader(is、charset.forname( "utf-8"))); printwriter pw = new Printwriter(OS); string clientip = socketclient.getineTaddress()。toString()。サブストリング(1); //クライアントIP文字列username = "not not logged in"; // username string password = ""; // password string command = ""; // command boolean loginstus = false; string str = ""; //コマンドコンテンツ文字列int port_high = 0; int port_low = 0; string retr_ip = ""; //受信ファイルソケットのIPアドレスはtempsocket = null; //ウェルカムメッセージを印刷するpw.println( "220-ftpサーバーaバージョン1.0 Leon Guoによって書かれた"); pw.flush(); logger.info( "("+username+")("+clientIp+")>接続、歓迎メッセージを送信..."); logger.info( "("+username+")("+clientIp+")> 220-ftpサーバーAバージョン1.0 Leon Guo");ブールb = true; while(b){try {// user command = br.readline()によって入力されたコマンドを取得します; if(null == command)break; } catch(ioException e){pw.println( "331コマンドを取得できなかった"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 331コマンドを取得できなかった"); logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); } b = false; } /** CONTROL COMMAND* / //ユーザーコマンドif(command.touppercase()。startswith( "user")){logger.info( "("+clientip+")>"+command); username = command.substring(4).trim(); if( ""。equals(username)){pw.println( "501構文エラー"); pw.flush(); logger.info( "(ログインしていない)("+clientIp+")> 501構文エラー"); username = "not logged in"; } else {pw.println( "331パスワードが" + username); pw.flush(); logger.info( "(ログインしていない)("+clientIp+")> 331パスワード「+username); } loginstus = false; } // end user //パスコマンドelse if(command.touppercase()。startswith( "pass")){logger.info( "("+clientip+")>"+command);パスワード= command.substring(4).trim(); if(username.equals( "root")&& password.equals( "root")){pw.println( "230 logged on"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 230ログオン"); // logger.info( "client"+clientip+"" user login "); loginstus = true;} else {pw.println(" 530ログインまたはパスワード不正! "); pw.flush(); logger.info("( "+clientip+") } // pass // pwdコマンドelse if(command.touppercase()。startswith( "pwd")){"+username+")( "+clientip+")> "+コマンド) pw.println( "257 /" "+pdir+" /"は現在のディレクトリ"); } else {pw.println(login_warning); pw.flush(); logger.info( "("+username+")("+clientIp+")>"+login_warning); }} // end pwd // cwdコマンドelse if(command.touppercase()。startswith( "cwd")){logger.info( "("+username+")("+clientip+")>"+command); if(loginstus){str = command.substring(3).trim(); if( ""。equals(str)){pw.println( "250壊れたクライアントが検出され、CWD。 /" "+pdir+" /"が現在のディレクトリ"です。 "); pw.flush(); logger.info( "("+username+")("+clientip+")> 250壊れたクライアントが検出された、CWD。/"+pdir+"/"は現在のディレクトリ "です。 = dir+"+str("/"equals(pdir)){pdir = pdir+"/"+str;ディレクトリ "); pw.flush(); logger.info( "("+username+")("+clientip+")> 250 cwd succupd。/"+pdir+"/"は現在のディレクトリ "です");} logger.info( "("+username+")("+clientIp+")> 550 cwd failed。 /"+pdir+" /":ディレクトリが見つかりません。 "); }} else {pw.println(login_warning); pw.flush(); logger.info( "("+username+")("+clientIp+")>"+login_warning); }} // end cwd // quit command else if(command.touppercase()。startswith( "quit")){logger.info( "("+username+")("+clientip+")>"+command); b = false; pw.println( "221 Goodbye"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 221 goodbye"); try {thread.currentthread(); thread.sleep(1000); } catch(arturnedexception e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }}} // quit /** parameterコマンドを転送* ///ポートコマンドを転送し、モードで積極的にデータを送信しますelse if(command.touppercase()。startswith( "port")){logger.info( "("+username+")("+clientip+")>"+コマンド); if(loginstuts){try {str = command.substring(4).trim(); port_low = integer.parseint(str.substring(str.lastindexof( "、")+1)); port_high = integer.parseint(str.substring(0、str.lastindexof( "、"))).substring(str.substring(0、str.lastindexof( "、"))。lastindexof( "、")+1)); string str1 = str.substring(0、str.substring(0、str.lastindexof( "、"))。lastindexof( "、")); retr_ip = str1.replace( "、"、 "。"); try {//アクティブモードのインスタンスソケットTempsocket = new Socket(retr_ip、port_high * 256 + port_low); // logger.info( "user"+clientip+":"+username+"execute port command"); pw.println( "200ポートコマンド成功"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 200ポートコマンド成功"); } catch(connectexception ce){pw.println( "425はデータ接続を開くことができません。"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 425は、データ接続を開くことができません。"); logger.error(ce.getMessage()); for(stacktraceElement ste:ce.getStacktrace()){logger.error(ste.tostring()); }} catch(unknownhostexception e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }} catch(ioexception e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }}} catch(numberformatexception e){pw.println( "503 bad sequence of commands。"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 503コマンドの悪いシーケンス。"); logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }}} else {pw.println(login_warning); pw.flush(); logger.info( "("+username+")("+clientIp+")>"+login_warning); }} // end port // pasvコマンド、パッシブモード転送データelse if(command.touppercase()。startswith( "pasv")){ogger.info( "("+username+")("+clientip+")>"+コマンド); if(loginstuts){serversocket ss = null; while(true){//サーバーを取得しますport_high = 1 + generator.nextint(20); port_low = 100 + generator.nextint(1000); try {//サーバーバインディングポートss = new Serversocket(port_high * 256 + port_low);壊す; } catch(ioException e){継続; }} // logger.info( "user"+clientip+":"+username+"pasvコマンドを実行"); inetAddress i = null; try {i = inetAddress.getLocalHost(); } catch(unknownhostexception e1){e1.printstacktrace(); } pw.println( "227パッシブモードの入力("+i.gethostaddress()。置換( "。"、 "、")+"、"+port_high+"、"+port_low+")"); pw.flush(); logger.info( "("+username+")("+clientip+")> 227パッシブモードの入力("+i.gethostaddress()。置換( "。"、 ")+"、 "+port_high+"、 "+port_low+") "); try {//パッシブモードのソケットTempsocket = ss.Accept(); ss.close(); } catch(ioException e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }}} else {pw.println(login_warning); pw.flush(); logger.info( "("+username+")("+clientIp+")>"+login_warning); }} // end pasv // ret command else if(command.touppercase()。startswith( "ret")){logger.info( "("+username+")("+clientip+")>"+command); if(loginstuts){str = command.substring(4).trim(); if( ""。equals(str)){pw.println( "501構文エラー"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 501構文エラー"); } else {try {pw.println( "ファイル転送用の150オープニングデータチャネル"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 150ファイル転送用のオープニングデータチャネル。"); randomAccessfile outfile = null; outputstream outsocket = null; {//ランダムアクセスファイルストリームを作成して、指定された名前を使用して(オプション)を書き込みます。 autrsocket = tempsocket.getOutputStream(); } catch(filenotfoundexception e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }} catch(ioexception e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }} byte bytebuffer [] = new byte [1024]; int length; try {while((length = outfile.read(bytebuffer))!= -1){outsocket.write(bytebuffer、0、length); } outsocket.close(); outfile.close(); tempsocket.close(); tempsocket.close(); } catch(ioException e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }} // logger.info( "user"+clientip+":"+username+"execute ret command"); pw.println( "226転送ok"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 226転送ok"); } catch(例外e){pw.println( "503バッドシーケンスのコマンドシーケンス。"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 503コマンドの悪いシーケンス。"); logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }}} else {pw.println(login_warning); pw.flush(); logger.info( "("+username+")("+clientIp+")>"+login_warning); }} // end retr // stor command else if(command.touppercase()。startswith( "stor")){logger.info( "("+username+")("+clientip+")>"+command); if(loginstuts){str = command.substring(4).trim(); if( ""。equals(str)){pw.println( "501構文エラー"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 501構文エラー"); } else {try {pw.println( "ファイル転送用の150オープニングデータチャネル"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 150ファイル転送用のオープニングデータチャネル。"); randomAccessfile file = null; inputstream insocket = null; try {file = new RandomAccessFile(dir+"/"+str、 "rw"); insocket = tempsocket.getInputStream(); } catch(filenotfoundexception e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }} catch(ioexception e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }} byte bytebuffer [] = new byte [1024]; int length; try {while((length = insocket.read(bytebuffer))!= -1){file.write(bytebuffer、0、length); } insocket.close(); infile.close(); tempsocket.close(); } catch(ioException e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }} // logger.info( "user"+clientip+":"+username+"execute storコマンド"); pw.println( "226転送ok"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 226転送ok"); } catch(例外e){pw.println( "503バッドシーケンスのコマンドシーケンス。"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 503コマンドの悪いシーケンス。"); logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }}}} else {pw.println(login_warning); pw.flush(); logger.info( "("+username+")("+clientIp+")>"+login_warning); }} // end stor // nlst command else if(command.touppercase()。startswith( "nlst")){logger.info( "("+username+")("+clientip+")>"+command); if(loginstuts){try {pw.println( "ディレクトリリスト用の150オープニングデータチャネル。"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 150ディレクトリリストのオープニングデータチャネル。"); printwriter pwr = null; try {pwr = new PrintWriter(tempsocket.getOutputStream()、true); } catch(ioexception e1){e1.printstacktrace(); } file file = new file(dir); string [] structure = new String [10]; virturcure = file.list(); for(int i = 0; i <dirstructure.length; i ++){pwr.println(dirstructure [i]); } try {tempsocket.close(); pwr.close(); } catch(ioException e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }} // logger.info( "user"+clientIp+":"+username+"nlstコマンドを実行"); pw.println( "226転送ok"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 226転送ok"); } catch(例外e){pw.println( "503バッドシーケンスのコマンドシーケンス。"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 503コマンドの悪いシーケンス。"); logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }}} else {pw.println(login_warning); pw.flush(); logger.info( "("+username+")("+clientIp+")>"+login_warning); }} // nlst //リストコマンドelse else if(command.touppercase()。startswith( "list")){logger.info( "("+username+")("+clientip+")>"+command); if(loginstuts){try {pw.println( "ディレクトリリスト用の150オープニングデータチャネル。"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 150ディレクトリリストのオープニングデータチャネル。"); printwriter pwr = null; try {pwr = new PrintWriter(tempsocket.getOutputStream()、true); } catch(ioException e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }} ftputil.getDetaillist(PWR、dir); {tempsocket.close(); pwr.close(); } catch(ioException e){logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }} // logger.info( "user"+clientIp+":"+username+"execute listコマンド"); pw.println( "226転送ok"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 226転送ok"); } catch(例外e){pw.println( "503バッドシーケンスのコマンドシーケンス。"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 503コマンドの悪いシーケンス。"); logger.error(e.getmessage()); for(stacktraceElement ste:e.getStacktrace()){logger.error(ste.tostring()); }}} else {pw.println(login_warning); pw.flush(); logger.info( "("+username+")("+clientIp+")>"+login_warning); }} // end list //違法コマンドを入力してくださいpw.println( "500構文エラー、コマンドが認識されていない。"); pw.flush(); logger.info( "("+username+")("+clientIp+")> 500構文エラー、コマンドは認識されていません。"); }} // try {logger.info( "("( "+username+")( "+clientip+")> disconnected。 "); // logger.info(" user "+clientip+": "+username+" exit "); br.close(); socketclient(); pw.close(); pw.close(); pw.close(); pw.close(); pw.close(); pw.close(); pw.close(); pw.close(); tempsocket.close() java.text.simpledateformat java.util.date * @author leon * * / public void getdetaillist(printwriter pw、string path){file dir = new file(!dir.isdirectory(! Directory./r/N ");} file [] files = dir.listfiles(); string modifyDate; for(int i = 0; i <files.length; i ++){new simpledateFormat(" yyyy/mm/dd hh:mm:mm:ss ").format(new files [i] .lastmodifiify(); (files [i] .isdirectory()){pw.println( "drwxr-xr-x ftp 0" + modifydate + "" + files [i] .getName())ファイル[i] .getname()); log4j.appender.stdout.target = system.out log4j.appender.stdout.layout = org.apache.log4j.patternlayout log4j.appender.stdout.layout.conversionpattern =%d {absolute}%5p%c {1} log4j.appender.d = org.apache.log4j.dailyrollingfileappender log4j.appender.d.file = c:/logs/logs.logs.logs.logs.logs.logs.logslogslogslogslog.logslogsopput log4j.appender.d.threshold = dabug log4j.appender.d.layout.conversionpattern =%-d {yyyy-mm-dd hh:mm:mm:ss} [%t:%r] - [%p]%m%n ###例外情報を別のファイルに保存しますlog4j.appender.e.file = c:/logs/errors.log log4j.appender.e.aptend = true ## log4j.appender.e.threshold =エラーlog4j.e.layout = org.apache.log4j. %-d {yyyy-mm-dd hh:mm:ss} [%t:%r] - [%p]%m%n上記のコンテンツは、編集者が紹介したFTPサーバー関数の例のJava実装に関する関連する知識です。気に入っていただければ幸いです。