我有一个关于用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();
}
}
这里有很多问题。
登录对话完全丢失(命令USER
和PASS
)。
您正在建立一个套接字,并将其用于命令和数据,但是FTP使用控制连接(通常在端口21上)进行命令,并使用数据连接(通常在端口20上进行数据传输)。
] >SEND
和RECEIVE
都不是FTP命令(使用STOR
和RETR
)。参见List of FTP commands。
您的客户端缺少CWD
和LIST
命令。这些是必不可少的。