日期:2014-05-20 浏览次数:20700 次
public class FtpClient {
private ClientView clientView;
/**
* 两个Socket分别用来传输文件和控制信息,类似于Ftp的Tcp 20、21。 20用来传输文件,21用来传输控制信息。
* */
private Socket fileSocket, commandSocket;
// 利用dis获取当前连接的输入流,并利用处理流进行封装。
private DataInputStream dis;
// 利用dos获取当前连接的输出流,并利用处理流进行封装。
private DataOutputStream dos;
// 选取默认路径保存文件
private String fileDir = "c:/";
private boolean flag = true;
public FtpClient() {
super();
}
public FtpClient(ClientView clientView) {
super();
this.clientView = clientView;
}
// 接收文件
public void receiveFile(Socket s, String str) throws Exception {
fileSocket = s;
dis = new DataInputStream(fileSocket.getInputStream());
String existFile = dis.readUTF();
clientView.getJta().append(existFile);
// 如果文件不存在,则不用接受文件
if (existFile.startsWith("404 File does not exist"))
;
// 如果文件存在,则接受文件
else {
clientView.getJta().append("发送文件名成功\n");
// 关联保存文件夹
File f = new File(fileDir);// 当前根目录
File file = new File(f, "Downloads" + File.separator + str); // 保存到当前目录得Downloads文件里面
// 传输文件前重新构造Socket
fileSocket = new Socket(clientView.getIPtf().getText(), 5432);
// 将文件封装到输出流中
BufferedOutputStream buff = new BufferedOutputStream(
new FileOutputStream(file));
// 获取当前连接的输入流,并利用处理流进行封装。
dis = new DataInputStream(fileSocket.getInputStream());
byte[] line = new byte[102400];// 每次发送的块打大小
clientView.getJta().append("开始接收文件\n");
clientView.getJta().append("文件传送中....\n");
int mount;
while ((mount = dis.read(line)) != -1) {
buff.write(line, 0, mount);
buff.flush();// 刷新
Thread.sleep(50);// 设置一个等待时间,有利于接收文件
}
clientView.getJta().append("finished\n");
buff.close();
}
fileSocket.close();
}
// 建立连接
public void TestStart() {
clientView.getJta().append("请发送命令: \n");
}
public void getCommand(String str) {
try {
// 设置flag=false相当于程序暂停
while (flag) {
commandSocket = new Socket(clientView.getIPtf().getText(),
Integer.parseInt(clientView.getJtf().getText()));
// 利用dos获取当前连接的输出流,并利用处理流进行封装。
dos = new DataOutputStream(commandSocket.getOutputStream());
dos.writeUTF(str);
// 利用dis获取当前连接的输入流,并利用处理流进行封装。