FTP客户端/服务器登录身份验证

时间:2019-10-16 01:51:12

标签: java sockets server ftp client

我有一个关于用Java创建FTP客户端的问题。

我创建了一些可以正常工作的FTP客户端,但是当我在终端上运行它时,它将停止,等待一会儿,然后返回错误消息。客户端必须连接到服务器IP地址,该IP地址需要用户名和密码进行身份验证和登录。但是,我无法使登录正常工作。

我不必创建FTP服务器,我们机构中已经有一个服务器必须连接。

这是我到目前为止为FTP客户端提供的代码:

import java.io.*;
import java.net.*;

class FTPC
{
    public static void main(String[] args) throws Exception
    {
        String option;
        DataInputStream in=new DataInputStream(System.in);
        Socket s=new Socket("10.246.251.39",Integer.parseInt(args[0]));
        System.out.println("MENU");
        System.out.println("1.SEND");
        System.out.println("2.RECEIVE");
        FTPC ftp=new FTPC();

        while(true)
        {
            option=in.readLine();
            if(option.equals("1")){
                System.out.println("SEND Command Received..");
                ftp.sendfile(s);
            }
            else if(option.equals("2")){
                System.out.println("RECEIVE Command Received..");
                ftp.receivefile(s);
            }
        }
    }

    public void sendfile(Socket s) throws Exception
    {
        Socket ssock=s;

        DataInputStream in=new DataInputStream(System.in);

        DataInputStream cin=new DataInputStream(ssock.getInputStream());
        DataOutputStream cout=new DataOutputStream(ssock.getOutputStream());

        cout.writeUTF("RECEIVE");

        String filename=in.readLine();
        System.out.println("Reading File "+filename);
        cout.writeUTF(filename);
        File f=new File(filename);
        FileInputStream fin=new FileInputStream(f);
        int ch;
        do
        {
            ch=fin.read();
            cout.writeUTF(String.valueOf(ch));
        }while(ch!=-1);
        fin.close();
        System.out.println("File Sent");
    }

    public void receivefile(Socket s) throws Exception
    {
        Socket ssock=s;
        DataInputStream in=new DataInputStream(System.in);
        DataInputStream cin=new DataInputStream(ssock.getInputStream());
        DataOutputStream cout=new DataOutputStream(ssock.getOutputStream());

        cout.writeUTF("SEND");

        String filename=in.readLine();
        cout.writeUTF(filename);
        System.out.println("Receiving File "+filename);
        File f=new File(filename);
        FileOutputStream fout=new FileOutputStream(f);
        int ch;
        do
        {
            ch=Integer.parseInt(cin.readUTF());
            if(ch!=-1) fout.write(ch);
        }while(ch!=-1);
        System.out.println("Received File...");
        fout.close();
    }
} 

1 个答案:

答案 0 :(得分:2)

这里有很多问题:

  1. 登录对话完全丢失(命令USERPASS)。

  2. 您正在建立一个套接字,并将其用于命令和数据,但是FTP使用控制连接(通常在端口21上)进行命令,并使用数据连接(通常在端口20上)进行数据传输。 / p>

  3. SENDRECEIVE都不是FTP命令。而是使用STORRETR。 (请参见List of FTP commands。)

  4. 您的客户端缺少CWDLIST命令。这些是必不可少的。