还是有关ftp client和list的问题,您进来看看,也许会呢:)我不在乎分数的 记得ftp占用两个端口,是不是在21以外的那个端口输出啊?瞎猜。:) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有的ftp服务器就是通过停掉另外一个端口的方式来禁止用户使用list.:) 嗯,好像不是,直接用命令行方式登陆,就可以list没人帮帮我么? list是从数据端口返回结果的,根据模式的不同,需要客户端listen/或者发除connect请求服务器协议解释器会在端口L侦听,用户或用户协议解释器初始化全双工控制连接,服务器和用户进程应该遵守Telnet协议的说明进行。服务器不提供对命令行的编辑功能,应该由用户负责这一切。在全部传送和应答结束后,在用户的请求下服务器关闭控制连接。用户DTP必须在指定的数据端口上侦听,它可以是默认端口U或由PORT命令指定的端口。服务器的默认数据端口为L-1。传输方向和端口均可由FTP命令决定。只有用户PI可以改变默认端口。当数据在服务器A和B之间传送时,用户PI,C,在两个服务器PI之间建立控制连接。其中一个服务器A,在接收到传输服务命令时接收PASV命令初始化连接,用户PI接收到PASV命令的确认时(确认内包括主机标识和端口),将端口以PORT命令发送到B。在接收到确认后,用户PI可以发送相应的命令给A和B了,B初始连接和传输进程,命令应答序列如下面所示,{图片http://www.longen.com/E-K/detaile~k/FTP-7.gif}请根据位置注意时差: 首先cuteftp, smartftp以及网际快车,网络蚂蚁一样的有这个问题。要不你贴出你的那一段代码看看 byte[] commandPasv = {'p', 's', 's', 'v', '\n'};outStream.write(commandPasv, 0, commandPasv.length );byte[] commandList = {'l', 'i', 's', 't', '\n'};outStream.write(commandList, 0, commandList.length );pasv返回了端口号(如:211,101,151,33,133,192),是否就要监听这个端口么?前32位是本地的ip,后16位是端口号。如果是需要的话,怎么监听呀?用DatagramPacket?多多指教呀 PASV是被动模式,就是从客户端连接到服务器,pasv返回的是服务器侦听端口。用socket(stream)连接到该端口,读取数据。 补充 :如果不是pasv模式,需要client先使用port(ip1,ip2,ip3,ip4,port1,port2)命令指定端口号,并在客户端的该端口listen,再使用list,server会连接到该口发送数据。 编程级的command是:1 cwd path //path 为你要进入的路径2 pwd3 type a //最好用a,你要是想用i也随便你4 list //如果有必要,你可以追查一下它返回的值,不过,227 表示已经成功了你应该是忘了把它的信息读回来,编程级的command是不会象在命令行下一样返回目录信息的 DataInputStream ost = new DataInputStream(clientSocket.getInputStream()); int num0,num1; String str = ost.readLine () ; int i = 0; byte[] cb_char; while (str!=null) { //自己处理去吧!:) } to hangcom:inStream = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));while (null != (responseLine = inStream.readLine())) { System.out.println(responseLine);}应该没问题呀to Kevin_qing:还是搞不定,我在试验试验to airwing:哦?rfc文档说明为前面的(133)是高位多谢大家支持,我在努力!!! 简单方法测试:找一个ftp server ,例为 ftp.foo.comtelnet ftp.foo.com 21user anonymouspass user@hostpasv(记录下端口号)list再新开一个telnet 连接到刚才的端口,就可以接受到list的文件名了 //这是我当时写的一段代码,你可以参照一下,其中有些部分对你没有意义,只是我不愿去掉 public boolean ListDir(String command, DataInputStream incontrolport, PrintStream outcontrolport){ ServerSocket serverSocket = null; Socket clientSocket = null ; try { serverSocket = new ServerSocket(0); } catch (IOException e) { System.out.println("Could not get port for listening: " + serverSocket.getLocalPort() + ", " + e); return(false); } // set binary type transfer // outcontrolport.print ("pwd"+"\r\n"); StringTokenizer tmp = new StringTokenizer(command,"?"); String path = tmp.nextToken (); path = tmp.nextToken (); //得到第二个Token,麻烦了一点:P outcontrolport.print ("cwd "+path+"\r\n"); int ret = getreply(incontrolport); if (ret == ERROR) return false; //在此加入出错控制,否则不能保证完全正常运行 outcontrolport.print ("pwd\r\n"); getreply(incontrolport); outcontrolport.print("type a" + "\r\n"); port(serverSocket, incontrolport, outcontrolport); getreply(incontrolport); outcontrolport.print ("list\r\n"); if (getreply(incontrolport)==ERROR) return false; // send restart if desired if(restartpoint != 0){ // have to do right before retr? outcontrolport.print("rest " + restartpoint + "\r\n"); System.out.println("rest " + restartpoint); getreply(incontrolport); } // ok, send command // clean up when done try { clientSocket = serverSocket.accept(); } catch (IOException e) { System.out.println("Accept failed: " + serverSocket.getLocalPort() + ", " + e); } try { DataInputStream ost = new DataInputStream(clientSocket.getInputStream()); int num0,num1; String str = ost.readLine () ; int i = 0; byte[] cb_char; while (str!=null) { //在此添加代码将得到的一行数据进行解析,得出当前的信息是文件还是目录,选择图标, //如有必要,可以设置一个新的文本框,将文件的信息显示在其中, //解析的过程留在主程序中完成,在此只要把文件信息全部读到一个数组中即可 cb_char = str.getBytes ("iso-8859-1"); str = new String(cb_char);// table[i++] = str; table.addElement (str); str = ost.readLine (); }// table[i]=null; } catch (IOException e) { System.out.println(e); } try { clientSocket.close (); serverSocket.close(); } catch (IOException e) { e.printStackTrace (); } getreply(incontrolport); return true; }// end List 先要熟悉FTP协议模型,RFCXXX,我也忘了是那个,FTP控制用21断口,数据传送20端口,当LIST了之后,需要在20端口创建一个数据连接,告诉服务器端本地端口号,命令方式是PORT xxxx然后就可以接受LIST的结果。 向数据库插入图片 提示SQL syntax错误 数组问题 求助读入 读写问题 Timer中得任务出了异常怎么捕获? 大家帮我看一下这个语句好吗? 非常简单、一看明白 url始终找不到的问题 win2000server下为什么不能显示中文? 各位一定要帮我呀我上不了java.sun.com了 一个关于Java包的问题,急,急 请问如何将com.inet.tds.TdsDriver的限制去掉?它好像只能接受3个连接。高分相送! java如何在linux下应用 ?
服务器协议解释器会在端口L侦听,用户或用户协议解释器初始化全双工控制连接,服务器和用户进程应该遵守Telnet协议的说明进行。服务器不提供对命令行的编辑功能,应该由用户负责这一切。在全部传送和应答结束后,在用户的请求下服务器关闭控制连接。用户DTP必须在指定的数据端口上侦听,它可以是默认端口U或由PORT命令指定的端口。服务器的默认数据端口为L-1。传输方向和端口均可由FTP命令决定。只有用户PI可以改变默认端口。当数据在服务器A和B之间传送时,用户PI,C,在两个服务器PI之间建立控制连接。其中一个服务器A,在接收到传输服务命令时接收PASV命令初始化连接,用户PI接收到PASV命令的确认时(确认内包括主机标识和端口),将端口以PORT命令发送到B。在接收到确认后,用户PI可以发送相应的命令给A和B了,B初始连接和传输进程,命令应答序列如下面所示,
{图片http://www.longen.com/E-K/detaile~k/FTP-7.gif}
请根据位置注意时差:
要不你贴出你的那一段代码看看
outStream.write(commandPasv, 0, commandPasv.length );byte[] commandList = {'l', 'i', 's', 't', '\n'};
outStream.write(commandList, 0, commandList.length );pasv返回了端口号(如:211,101,151,33,133,192),是否就要监听这个端口么?
前32位是本地的ip,后16位是端口号。
如果是需要的话,怎么监听呀?
用DatagramPacket?
多多指教呀
如果不是pasv模式,需要client先使用port(ip1,ip2,ip3,ip4,port1,port2)命令指定端口号,并在客户端的该端口listen,再使用list,server会连接到该口发送数据。
1 cwd path //path 为你要进入的路径
2 pwd
3 type a //最好用a,你要是想用i也随便你
4 list //如果有必要,你可以追查一下它返回的值,不过,227 表示已经成功了
你应该是忘了把它的信息读回来,编程级的command是不会象在命令行下一样返回目录信息的
DataInputStream ost = new DataInputStream(clientSocket.getInputStream());
int num0,num1;
String str = ost.readLine () ;
int i = 0;
byte[] cb_char;
while (str!=null)
{
//自己处理去吧!:)
}
inStream = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));while (null != (responseLine = inStream.readLine())) {
System.out.println(responseLine);
}
应该没问题呀to Kevin_qing:
还是搞不定,我在试验试验to airwing:
哦?rfc文档说明为前面的(133)是高位多谢大家支持,我在努力!!!
找一个ftp server ,例为 ftp.foo.com
telnet ftp.foo.com 21
user anonymous
pass user@host
pasv
(记录下端口号)
list再新开一个telnet 连接到刚才的端口,就可以接受到list的文件名了
public boolean ListDir(String command, DataInputStream
incontrolport, PrintStream outcontrolport){ ServerSocket serverSocket = null;
Socket clientSocket = null ;
try {
serverSocket = new ServerSocket(0);
}
catch (IOException e) {
System.out.println("Could not get port for listening: " +
serverSocket.getLocalPort() + ", " + e);
return(false);
}
// set binary type transfer
// outcontrolport.print ("pwd"+"\r\n");
StringTokenizer tmp = new StringTokenizer(command,"?");
String path = tmp.nextToken ();
path = tmp.nextToken (); //得到第二个Token,麻烦了一点:P
outcontrolport.print ("cwd "+path+"\r\n");
int ret = getreply(incontrolport);
if (ret == ERROR)
return false;
//在此加入出错控制,否则不能保证完全正常运行
outcontrolport.print ("pwd\r\n");
getreply(incontrolport);
outcontrolport.print("type a" + "\r\n");
port(serverSocket, incontrolport, outcontrolport);
getreply(incontrolport);
outcontrolport.print ("list\r\n");
if (getreply(incontrolport)==ERROR)
return false; // send restart if desired
if(restartpoint != 0){
// have to do right before retr?
outcontrolport.print("rest " + restartpoint + "\r\n");
System.out.println("rest " + restartpoint);
getreply(incontrolport);
} // ok, send command // clean up when done
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.out.println("Accept failed: " + serverSocket.getLocalPort() + ", " + e);
}
try
{
DataInputStream ost = new DataInputStream(clientSocket.getInputStream());
int num0,num1;
String str = ost.readLine () ;
int i = 0;
byte[] cb_char;
while (str!=null)
{
//在此添加代码将得到的一行数据进行解析,得出当前的信息是文件还是目录,选择图标,
//如有必要,可以设置一个新的文本框,将文件的信息显示在其中,
//解析的过程留在主程序中完成,在此只要把文件信息全部读到一个数组中即可
cb_char = str.getBytes ("iso-8859-1");
str = new String(cb_char);
// table[i++] = str;
table.addElement (str);
str = ost.readLine ();
}
// table[i]=null;
}
catch (IOException e)
{ System.out.println(e);
}
try
{ clientSocket.close ();
serverSocket.close();
}
catch (IOException e)
{ e.printStackTrace ();
} getreply(incontrolport);
return true;
}// end List
FTP控制用21断口,数据传送20端口,当LIST了之后,需要在20端口
创建一个数据连接,告诉服务器端本地端口号,命令方式是PORT xxxx
然后就可以接受LIST的结果。