[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工具,经测试可以正常运行。
相关文章推荐
- Java中实现FTP上传下载文件的功能,完整代码
- Java中实现FTP上传下载文件的功能,完整代码
- Java中实现FTP上传下载文件的功能,完整代码
- Java中实现FTP上传下载文件的功能
- 用java实现上传下载功能
- java 实现FTP上传下载!
- JAVA应用XFire框架来实现WebServie的大文件传输功能之一(下载)
- 利用Java实现的下载功能 不支持断点续传
- commons net jar包实现文件ftp上传和下载功能 (commons net ftp 使用1)
- Java实现FTP的上传下载功能
- Java实现FTP上传下载功能
- java 通过 URL 类和 URLConnection类 以及输入流实现文件下载功能
- JAVA实现FTP上传下载
- 用java实现上传下载功能
- java实现ftp上传下载
- Java实现文件下载功能
- java 通过 URL 类和 URLConnection类 以及输入流实现文件下载功能
- JAVA实现FTP服务器文件的上传,下载,删除功能
- Java实现FTP上传下载功能
- Java多线程实现下载功能