📄 ftp2.java
字号:
// ftp 僾儘僌儔儉Ftp2.java
// 偙偺僾儘僌儔儉偼,ftp 僒乕僶偲愙懕偟傑偡
// 僨乕僞梡僐僱僋僔儑儞傪梡堄偟,LIST僐儅儞僪傪幚峴偟傑偡
// 僼傽僀儖揮憲婡擻偼偁傝傑偣傫
// 巊偄曽java Ftp2 僒乕僶傾僪儗僗
// 婲摦偺椺java Ftp2 kiku.fuis.fukui-u.ac.jp
// 儔僀僽儔儕偺棙梡
import java.net.*;
import java.io.*;
// Ftp2僋儔僗
public class Ftp2 {
// 僜働僢僩偺弨旛
Socket ctrlSocket;//惂屼梡僜働僢僩
public PrintWriter ctrlOutput;//惂屼弌椡梡僗僩儕乕儉
public BufferedReader ctrlInput;// 摨擖椡梡僗僩儕乕儉
final int CTRLPORT = 21 ;// ftp 偺惂屼梡億乕僩
// openConnection儊僜僢僪
//傾僪儗僗偲億乕僩斣崋偐傜僜働僢僩傪嶌傝惂屼梡僗僩儕乕儉傪嶌惉偟傑偡
public void openConnection(String host)
throws IOException,UnknownHostException
{
ctrlSocket = new Socket(host, CTRLPORT);
ctrlOutput = new PrintWriter(ctrlSocket.getOutputStream());
ctrlInput
= new BufferedReader(new InputStreamReader
(ctrlSocket.getInputStream()));
}
// closeConnection儊僜僢僪
//惂屼梡偺僜働僢僩傪暵偠傑偡
public void closeConnection()
throws IOException
{
ctrlSocket.close() ;
}
// showMenu儊僜僢僪
// Ftp 偺僐儅儞僪儊僯儏乕傪弌椡偟傑偡
public void showMenu()
{
System.out.println(">Command?") ;
System.out.print("1 login") ;
System.out.print(" 2 ls") ;
System.out.print(" 3 cd") ;
System.out.println(" 9 quit") ;
}
// getCommand儊僜僢僪
// 棙梡幰偺巜掕偟偨僐儅儞僪斣崋傪撉傒庢傝傑偡
public String getCommand()
{
String buf = "" ;
BufferedReader lineread
= new BufferedReader(new InputStreamReader(System.in)) ;
while(buf.length() != 1){// 侾暥帤偺擖椡傪庴偗傞傑偱孞傝曉偟
try{
buf = lineread.readLine() ;
}catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
return (buf) ;
}
// doLogin儊僜僢僪
// ftp 僒乕僶偵儘僌僀儞偟傑偡
public void doLogin()
{
String loginName = "" ;
String password = "" ;
BufferedReader lineread
= new BufferedReader(new InputStreamReader(System.in)) ;
try{
System.out.println("儘僌僀儞柤傪擖椡偟偰偔偩偝偄") ;
loginName = lineread.readLine() ;
// USER僐儅儞僪偵傛傞儘僌僀儞
ctrlOutput.println("USER " + loginName) ;
ctrlOutput.flush() ;
// PASS僐儅儞僪偵傛傞僷僗儚乕僪偺擖椡
System.out.println("僷僗儚乕僪傪擖椡偟偰偔偩偝偄") ;
password = lineread.readLine() ;
ctrlOutput.println("PASS " + password) ;
ctrlOutput.flush() ;
}catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
// doQuit儊僜僢僪
// ftp 僒乕僶偐傜儘僌傾僂僩偟傑偡
public void doQuit()
{
try{
ctrlOutput.println("QUIT ") ;// QUIT僐儅儞僪偺憲怣
ctrlOutput.flush() ;
}catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
// doCd儊僜僢僪
// 僨傿儗僋僩儕傪曄峏偟傑偡
public void doCd()
{
String dirName = "" ;
BufferedReader lineread
= new BufferedReader(new InputStreamReader(System.in)) ;
try{
System.out.println("僨傿儗僋僩儕柤傪擖椡偟偰偔偩偝偄") ;
dirName = lineread.readLine() ;
ctrlOutput.println("CWD " + dirName) ;// CWD僐儅儞僪
ctrlOutput.flush() ;
}catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
// doLs儊僜僢僪
// 僨傿儗僋僩儕忣曬傪摼傑偡
public void doLs()
{
try{
int n ;
byte[] buff = new byte[1024] ;
// 僨乕僞梡僐僱僋僔儑儞傪嶌惉偟傑偡
Socket dataSocket = dataConnection("LIST") ;
// 僨乕僞撉傒庢傝梡僗僩儕乕儉傪梡堄偟傑偡
BufferedInputStream dataInput
= new BufferedInputStream(dataSocket.getInputStream()) ;
// 僨傿儗僋僩儕忣曬傪撉傒庢傝傑偡
while((n = dataInput.read(buff)) > 0){
System.out.write(buff,0,n) ;
}
dataSocket.close() ;
}catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
// dataConnection儊僜僢僪
// 僒乕僶偲偺僨乕僞岎姺梡偵僜働僢僩傪嶌傝傑偡
// 傑偨,僒乕僶偵懳偟偰port僐儅儞僪偱億乕僩傪捠抦偟傑偡
public Socket dataConnection(String ctrlcmd)
{
String cmd = "PORT " ; //PORT僐儅儞僪偱憲傞僨乕僞偺奿擺梡曄悢
int i ;
Socket dataSocket = null ;// 僨乕僞揮憲梡僜働僢僩
try{
// 帺暘偺傾僪儗僗傪媮傔傑偡
byte[] address = InetAddress.getLocalHost().getAddress() ;
// 揔摉側億乕僩斣崋偺僒乕僶僜働僢僩傪嶌傝傑偡
ServerSocket serverDataSocket = new ServerSocket(0,1) ;
// PORT僐儅儞僪梡偺憲怣僨乕僞傪梡堄偟傑偡
for(i = 0; i < 4; ++i)
cmd = cmd + (address[i] & 0xff) + "," ;
cmd = cmd + (((serverDataSocket.getLocalPort()) / 256) & 0xff)
+ ","
+ (serverDataSocket.getLocalPort() & 0xff) ;
// PORT僐儅儞僪傪惂屼梡僗僩儕乕儉傪捠偟偰憲傝傑偡
ctrlOutput.println(cmd) ;
ctrlOutput.flush() ;
// 張棟懳徾僐儅儞僪乮LIST,RETR,偍傛傃STOR乯傪僒乕僶偵憲傝傑偡
ctrlOutput.println(ctrlcmd) ;
ctrlOutput.flush() ;
// 僒乕僶偐傜偺愙懕傪庴偗晅偗傑偡
dataSocket = serverDataSocket.accept() ;
serverDataSocket.close() ;
}catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
return dataSocket ;
}
// execCommand儊僜僢僪
// 僐儅儞僪偵懳墳偡傞奺張棟傪屇傃弌偟傑偡
public boolean execCommand(String command)
{
boolean cont = true ;
switch(Integer.parseInt(command)){
case 1 : // login 張棟
doLogin() ;
break ;
case 2 : // 僒乕僶偺僨傿儗僋僩儕昞帵張棟
doLs() ;
break ;
case 3 : // 僒乕僶偺嶌嬈僨傿儗僋僩儕曄峏張棟
doCd() ;
break ;
case 9 : // 張棟偺廔椆
doQuit() ;
cont = false ;
break ;
default : //偦傟埲奜偺擖椡
System.out.println("斣崋傪慖戰偟偰偔偩偝偄") ;
}
return(cont) ;
}
// main_proc儊僜僢僪
// Ftp 偺僐儅儞僪儊僯儏乕傪弌椡偟偰,奺張棟傪屇傃弌偟傑偡
public void main_proc()
throws IOException
{
boolean cont = true ;
try {
while(cont){
// 儊僯儏乕傪弌椡偟傑偡
showMenu() ;
// 僐儅儞僪傪庴偗庢傝幚峴偟傑偡
cont = execCommand(getCommand()) ;
}
}
catch(Exception e){
System.err.print(e);
System.exit(1);
}
}
// getMsgs儊僜僢僪
// 惂屼僗僩儕乕儉偺庴怣僗儗僢僪傪奐巒偟傑偡
public void getMsgs(){
try {
CtrlListen listener = new CtrlListen(ctrlInput) ;
Thread listenerthread = new Thread(listener) ;
listenerthread.start() ;
}catch(Exception e){
e.printStackTrace() ;
System.exit(1) ;
}
}
// main儊僜僢僪
// TCP僐僱僋僔儑儞傪奐偄偰張棟傪奐巒偟傑偡
public static void main(String[] arg){
try {
Ftp2 f = null;
f = new Ftp2();
f.openConnection(arg[0]); // 惂屼梡僐僱僋僔儑儞偺愝掕
f.getMsgs() ; // 庴怣僗儗僢僪偺奐巒
f.main_proc(); // ftp 張棟
f.closeConnection() ; // 僐僱僋僔儑儞偺僋儘乕僘
System.exit(0) ; // 僾儘僌儔儉偺廔椆
}catch(Exception e){
e.printStackTrace();
System.exit(1);
}
}
}
// CtrlListen 僋儔僗
class CtrlListen implements Runnable{
BufferedReader ctrlInput = null ;
// 僐儞僗僩儔僋僞撉傒庢傝愭偺巜掕
public CtrlListen(BufferedReader in){
ctrlInput = in ;
}
public void run(){
while(true){
try{ // 傂偨偡傜峴傪撉傒庢傝,昗弨弌椡偵僐僺乕偟傑偡
System.out.println(ctrlInput.readLine()) ;
} catch (Exception e){
System.exit(1) ;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -