// FTP LS
import java.net.*;
import java.io.*;
public class FtpLS {
final public static boolean debug=true; // true for debug trace
protected Socket ctlskt; // control socket
protected Socket datskt; // data socket
protected Reader datReader; // IO Stream for data socket
protected Writer datWriter;
protected BufferedReader ctlin; // Control port reader
protected OutputStream ctlout; // Control port writer
public String lastResponse; // Last response from host
public boolean passive = false; // passive mode
// Connect to host -- we don't do ACCT
public boolean connect(String host,String user, String pw)
throws UnknownHostException, IOException {
int status;
ctlskt=new Socket(host,21);
ctlin=new BufferedReader(
new InputStreamReader(ctlskt.getInputStream()));
ctlout=ctlskt.getOutputStream();
do {
status=getResponse();
} while (status!=220 && status!=-1);
if (status==-1) {
return false;
}
status=sendCmd("USER " + user);
if (status==331) status=sendCmd("PASS " + pw);
if (status==332) return false; // no ACCT
if (status!=230) return false;
return true;
}
// This creates a data socket, issues a port command
// and then pipes everything from the
// data port to the specified writer (which could
// be the console, or a string, or a file)
protected int dataSocket(String datCmd) throws IOException {
int port;
int status;
ServerSocket datsktsvr;
if (passive) {
java.util.StringTokenizer token;
StringBuffer IP=new StringBuffer();
int i;
status=sendCmd("PASV");
if (status<200||status>299) return -1;
// find IP/port
for (i=4;i<lastResponse.length();i++)
if (Character.isDigit(lastResponse.charAt(i))) break;
if (i==lastResponse.length()) return -1; // not found
token=new java.util.StringTokenizer(lastResponse.substring(i),",) ");
if (token.countTokens()!=6) return -1; // unknown IP/port
for (i=0;i<4;i++) {
IP.append(token.nextToken());
if (i!=3) IP.append(".");
}
port=Integer.parseInt(token.nextToken())*256;
port+=Integer.parseInt(token.nextToken());
datskt=new Socket(IP.toString(),port);
status=sendCmd(datCmd);
}
else {
datsktsvr=new ServerSocket(0);
port=datsktsvr.getLocalPort();
//set host/port
StringBuffer cmd = new StringBuffer("PORT ");
cmd.append(ctlskt.getLocalAddress().getHostAddress());
for (int i = 0; i < cmd.length(); i++) {
if ('.' == cmd.charAt(i))
cmd.setCharAt(i, ',');
}
cmd.append(",");
cmd.append(Integer.toString(port/256));
cmd.append(",");
cmd.append(Integer.toString(port&0xFF));
status=sendCmd(cmd.toString());
if (status!=200) return -1;
status=sendCmd(datCmd);
// wait for remote connection (could time out)
datskt=datsktsvr.accept();
}
return 0;
}
public int dataSocketIn(String datCmd,Writer w) throws IOException {
int status;
status=dataSocket(datCmd);
if (status!=0) return status;
datReader=new InputStreamReader(datskt.getInputStream());
// transfer data until socket closes
int ch;
do {
ch=datReader.read();
if (ch!=-1) w.write((char)ch);
} while (ch!=-1);
w.flush();
datskt.close();
return getResponse();
}
public int dataSocketOut(String datCmd,Reader r) throws IOException {
int status;
status=dataSocket(datCmd);
if (status!=0) return status;
datWriter=new OutputStreamWriter(datskt.getOutputStream());
int ch;
do {
ch=r.read();
if (ch!=-1) datWriter.write((char)ch);
} while (ch!=-1);
datWriter.flush();
datskt.close();
return getResponse();
}
// Get a response accounting for possible mutliline responses
protected int getResponse() throws IOException {
int n;
String tmp;
do {
lastResponse=ctlin.readLine();
if (debug) System.out.println("DEBUG Received: " + lastResponse);
} while (lastResponse.charAt(3)=='-');
tmp=lastResponse.substring(0,3);
try {
n=Integer.parseInt(tmp);
}
catch (NumberFormatException e) {
n=-1;
}
return n;
}
// Send a command and return status code
public int sendCmd(String cmd) throws IOException {
if (debug) System.out.println("DEBUG Sent: " + cmd);
String tmp=cmd+"\r\n";
int n;
ctlout.write(tmp.getBytes());
ctlout.flush();
return getResponse();
}
// Main driver
public static void main(String [] args) throws Exception {
if (args.length<3||args.length>4) {
System.out.println("usage: EZftp host user password [directory]");
System.exit(1);
}
FtpLS obj= new FtpLS();
obj.passive=true;
if (!obj.connect(args[0],args[1],args[2])) {
System.out.println("Can't connect");
System.exit(1);
}
// Last argument is directory if present
if (args.length==4)
obj.sendCmd("CWD " + args[3]);
// print directory (chop off response code)
obj.sendCmd("PWD");
System.out.println(obj.lastResponse.substring(4));
// Do a directory
obj.dataSocketIn("LIST",new OutputStreamWriter(System.out));
// Additional code
FileWriter f = new FileWriter("ftp.test");
obj.dataSocketIn("RETR readme",f);
System.out.println(obj.lastResponse);
// Write test
FileReader fw = new FileReader("ftp.test");
obj.dataSocketOut("STOR ftp.test",fw);
System.out.println(obj.lastResponse);
System.exit(0);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
这是我翻译的第一本书:<<Java2网络协议内幕>>一书的源代码。<br>挺实用的一本书。<br>网址是:<br>http://iihero.cn/frog/user/seanho/article/2008-01-23/6<br>http://www.china-pub.com/6886<br>
资源推荐
资源详情
资源评论
收起资源包目录
Java2网络协议内幕 一书源码 (257个子文件)
TFTPCUSTOM.CLASS 7KB
TFTPSOCKET.CLASS 7KB
SMTP.CLASS 7KB
SFTPSERVER.CLASS 7KB
NEWSCLIENT.CLASS 6KB
SMTP.CLASS 6KB
SENESCHAL.CLASS 6KB
TELNETTTY.CLASS 5KB
HTTPPROXY.CLASS 5KB
AUCTIONAPPLET.CLASS 4KB
POPCLIENT.CLASS 4KB
SENDFILE.CLASS 4KB
FTPLS.CLASS 4KB
AUCTSERVER.CLASS 4KB
TELNETTTY.CLASS 4KB
XMLECHO1.CLASS 4KB
XMLVALID.CLASS 4KB
WEBPARSE2.CLASS 3KB
LINKCK.CLASS 3KB
WEBPARSE.CLASS 3KB
STEG.CLASS 3KB
XMLECHO.CLASS 3KB
POOLSERVERBASE.CLASS 3KB
FINGERSERVER.CLASS 3KB
DOMXFORM.CLASS 3KB
HTTPSERVER.CLASS 3KB
DOMDEMO.CLASS 2KB
TICTACTOE.CLASS 2KB
PARSETABLEENTRY.CLASS 2KB
FINGERPROXY.CLASS 2KB
BACKGROUNDTASK.CLASS 2KB
HTTPFORM.CLASS 2KB
TELNETSERVE.CLASS 2KB
B64ENCODER.CLASS 2KB
UDPECHOCLIENT.CLASS 2KB
LINKPAGE.CLASS 2KB
COOKIEPROXY.CLASS 2KB
PLAYTHREAD.CLASS 2KB
WHOIS.CLASS 2KB
UCSERVERPOOL.CLASS 2KB
INSEARCH.CLASS 2KB
UCSERVER.CLASS 2KB
MTSERVERBASE.CLASS 2KB
MTSERVERBASE.CLASS 2KB
MTSERVERBASE.CLASS 2KB
AHPARSE.CLASS 2KB
SHOWWEB1.CLASS 2KB
SERVER867.CLASS 2KB
HTMLPARSE.CLASS 2KB
SSLPOST.CLASS 2KB
FINGER.CLASS 2KB
URLSTRINGTEST.CLASS 2KB
X_JSTRING.CLASS 2KB
UDP0.CLASS 1KB
MAILFIND.CLASS 1KB
SUBHTTPPROXY.CLASS 1KB
BEERSERVER1.CLASS 1KB
SSLGET.CLASS 1KB
MTSERVER1.CLASS 1KB
LOCALSERVER.CLASS 1KB
TCPECHOSERVER.CLASS 1KB
TIMEHTTP.CLASS 1KB
CLIENT868BIG.CLASS 1KB
LINESERVER.CLASS 1KB
MTSERVER.CLASS 1KB
SERVER868.CLASS 1KB
TECHO.CLASS 1KB
CLIENT868.CLASS 1KB
SMTPRESULTS.CLASS 1KB
COMPSEND.CLASS 1KB
SMTPRESULTS.CLASS 1KB
JARPRINTER.CLASS 1KB
MAILMESSAGE.CLASS 1KB
MAILMESSAGE.CLASS 1KB
MAILMESSAGE.CLASS 1KB
TSERVER.CLASS 1KB
TS.CLASS 1KB
STRINGURLCONNECTION.CLASS 1KB
T.CLASS 1KB
UCWRITER.CLASS 1KB
OBJSERVER.CLASS 1KB
BEERSERVER.CLASS 1KB
TEXTONLY.CLASS 1020B
TICSERV.CLASS 1011B
TIMEOUTREAD.CLASS 1003B
TIME1HTTP.CLASS 994B
HTMLENCODER.CLASS 974B
SHOWHTML.CLASS 959B
DATACLIENT.CLASS 950B
WEBPING.CLASS 940B
GETIP.CLASS 929B
TIMEURLCONNECTION.CLASS 907B
COMPRCV.CLASS 905B
TIMEOUTREAD.CLASS 903B
SHOWWEB.CLASS 880B
LOCALSCAN.CLASS 852B
DATASERVER.CLASS 833B
TIMEURLTEST.CLASS 817B
TELNETTEST.CLASS 814B
OBJCLIENT.CLASS 786B
共 257 条
- 1
- 2
- 3
资源评论
- lzkxuexi2014-07-12虽然年代久远了一些,但是是很不错的学习资料
- gzx2013-07-30很有用,在学java socket通信相关的技术,多谢分享。
iihero_
- 粉丝: 2437
- 资源: 130
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功