您的位置:首页 > 编程语言 > Java开发

[IO流]Java实现FTP上传下载查看功能(非工具包无图形化界面)

2014-11-08 13:48 549 查看
虽然Java FTP客户端的工具包有很多,但是我不打算用工具包来实现FTP的上传下载和查看功能,以下代码仅是实现了FTP的这几个功能,且并没有做图形化界面。格式如下:

/*
* 写一个FTP软件, 要求客户端可以查看服务器端指定目录中的文件并可以上传下载。
* ftp>list		//查看FTP目录下的文件
* ftp>put a.txt	//上传文件
* ftp>get a.txt	//下载文件
*/
在同一个包下建有4各类,首先是客户端类:

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
private static final String path = "C:/JavaIO测试目录/Client/";//客户端目录地址

public static void main(String[] args) throws IOException {
System.out.println("客户端启动...");
Socket socket = new Socket("127.0.0.1",8888);
Scanner in = new Scanner(System.in);
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();

while(true){
System.out.print("FTP>");
String cmd = in.nextLine();//读取命令
String paras[] = cmd.split(" ");//将命令以空格拆分为数组保存
if(paras[0].equals("list")){
MsgUtils.sendMsg(os, cmd);
System.out.println(MsgUtils.receiveMsg(is));
}else if(paras[0].equals("get")){
MsgUtils.sendMsg(os, cmd);
FileUtils.receiveFile(is, new File(path+paras[1]));
}else if(paras[0].equals("put")){
MsgUtils.sendMsg(os, cmd);
FileUtils.sendFile(os, new File(path+paras[1]));
}else if(paras[0].equals("exit")){
MsgUtils.sendMsg(os, cmd);
break;
}else if(paras[0].equals("")){
continue;
}else{
System.out.println("输入有误,请重新输入");
continue;
}
}

os.close();
is.close();
in.close();
socket.close();
System.out.println("客户端关闭...");
}
}
服务器端类:

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
private static final String path = "C:/JavaIO测试目录/TestFTP/";//服务器端目录地址

public static void main(String[] args) throws IOException {
int i = 0;
System.out.println("服务器启动...");
ServerSocket ss = new ServerSocket(8888);
Socket socket = null;
InputStream is = null;
OutputStream os = null;

while (i<1) {
socket = ss.accept();//监听
is = socket.getInputStream();
os = socket.getOutputStream();
while (true) {
String cmd = MsgUtils.receiveMsg(is);//获取命令
String paras[] = cmd.split(" ");<span style="font-family: 宋体, 'Arial Narrow', arial, serif;">//将命令以空格拆分为数组保存</span>
if(paras[0].equals("list")){
MsgUtils.sendMsg(os, FileUtils.listFile(new File(path)));
}else if(paras[0].equals("get")){
FileUtils.sendFile(os, new File(path+paras[1]));
}else if(paras[0].equals("put")){
FileUtils.receiveFile(is, new File(path+paras[1]));
}else if(paras[0].equals("exit")){
break;
}
}
i++;
os.close();
is.close();
socket.close();
}

ss.close();
System.out.println("服务器关闭...");
}
}
数据和文件的传输、接收如果分别写在客户端和服务器端的话,会显得很凌乱,为了看起来代码更简洁和提高代码复用性,分别写了数据的传输工具类和文件工具类。让客户端和服务器端在使用相关功能时直接调用它们。

文件工具类:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileUtils {

public static void sendFile(OutputStream os , File file) throws IOException{//发送文件
int n = 0;
byte temp[] = new byte[1024];
FileInputStream fis = new FileInputStream(file);
while((n=fis.read(temp))!=-1){
os.write(temp, 0, n);
os.flush();
}
fis.close();
}

public static void receiveFile(InputStream is , File file) throws IOException{//接收文件
int n = 0;
byte temp[] = new byte[1024];
FileOutputStream fos = new FileOutputStream(file);
while((n=is.read(temp))!=-1){
fos.write(temp, 0, n);
fos.flush();
if(n!=1024){
break;//使用套接字通信时,用输入流读取信息是无法判断是否读完的,所以在循环读取时要加入退出循环的判断条件
}
}
fos.close();
}

public static String listFile(File folder){//查看功能
String result = "";
File files[] = folder.listFiles();
for(File file : files){
if(file.isFile()){
result = result + file.getName() + "\r\n";
}
}
if(result.equals("")){
result = "服务器目录下没有文件\r\n";
}
return result;
}
}
传输工具类:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class MsgUtils {

public static void sendMsg(OutputStream os,String msg) throws IOException{//发送数据
os.write(msg.getBytes());
os.flush();
}

public static String receiveMsg(InputStream is) throws IOException{//接收数据
int n = 0;
String msg = "";
byte bytes[] = new byte[1024];
if((n=is.read(bytes))!=-1){
msg = msg + new String(bytes, 0, n);//将读取到的字节数组转换为字符串
}
return msg;
}
}
在不用工具包的情况下就完成了这样一个没有图形化界面的简易Java FTP工具,经测试可以正常运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IO ftp socket java