本地socket连接到服务器21号口后,若发送LIST命令,返回信息是要先设定PASV/PORT模式,需要再开启一个数据链路,然后通过主socket(连接服务器21号)发送LIST命令,并通过新开的数据链路接收数据;
需要有两个套接字,一个用于命令(cmdSocket),一个用于数据(dataSocket) cmdSocket与ftp服务器21端口(如果ftp服务器没做特殊设置的话)连接,dataSocket因PASV和PORT模式不同,而有所差别。 PASV模式: 1)通过命令cmdSocket套接字发送PASV 2)server端会返回ip地址和专门的数据传输端口号 3)在命令套接字cmdSocket上发送LIST命令 4)本地建立dataSocket连接server提供的数据传输端口号(此步中,本地作为客户端) 5)server端通过cmdSocket返回150 开头的响应(需要读取cmdSocket) 6)本地通过dataSocket接收数据,即通过dataSocket的inputStream读取dataSocket中的数据 7)传输完毕(read返回-1),cmdSocket会返回226 开头的响应,关闭连接即可 PORT模式: 1)在本地启动某个端口的监听(本地作为服务端,使用ServerSocket) 2)通过命令cmdSocket套接字发送PORT,PORT命令后加参数:本地ip+刚启动监听的端口 3)server端响应200 4)在cmdSocket上发送LIST命令 5)调用ServerSocket.accept()获得数据套接字dataSocket(ftp server作为客户连接本地的端口) 6)server端通过cmdSocket返回150 开头的响应(需要读取cmdSocket) 7)本地通过dataSocket接收数据,即通过dataSocket的inputStream读取dataSocket中的数据 8)传输完毕(read返回-1),cmdSocket会返回226 开头的响应,关闭连接即可