记得ftp占用两个端口,是不是在21以外的那个端口输出啊?瞎猜。:)

解决方案 »

  1.   

    有的ftp服务器就是通过停掉另外一个端口的方式来禁止用户使用list.:)
      

  2.   

    嗯,好像不是,直接用命令行方式登陆,就可以list没人帮帮我么?
      

  3.   

    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}
    请根据位置注意时差:
      

  4.   

    首先cuteftp, smartftp以及网际快车,网络蚂蚁一样的有这个问题。
    要不你贴出你的那一段代码看看
      

  5.   

    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?
    多多指教呀
      

  6.   

    PASV是被动模式,就是从客户端连接到服务器,pasv返回的是服务器侦听端口。用socket(stream)连接到该端口,读取数据。
      

  7.   

    补充 :
    如果不是pasv模式,需要client先使用port(ip1,ip2,ip3,ip4,port1,port2)命令指定端口号,并在客户端的该端口listen,再使用list,server会连接到该口发送数据。
      

  8.   

    编程级的command是:
    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)
        {
         //自己处理去吧!:)
        }
      

  9.   

    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)是高位多谢大家支持,我在努力!!!
      

  10.   

    简单方法测试:
    找一个ftp server ,例为 ftp.foo.com
    telnet ftp.foo.com 21
    user anonymous
    pass user@host
    pasv
    (记录下端口号)
    list再新开一个telnet 连接到刚才的端口,就可以接受到list的文件名了
      

  11.   

    //这是我当时写的一段代码,你可以参照一下,其中有些部分对你没有意义,只是我不愿去掉
        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
      

  12.   

    先要熟悉FTP协议模型,RFCXXX,我也忘了是那个,
    FTP控制用21断口,数据传送20端口,当LIST了之后,需要在20端口
    创建一个数据连接,告诉服务器端本地端口号,命令方式是PORT xxxx
    然后就可以接受LIST的结果。