实例介绍
【实例简介】实现FTP的一些功能,如上传文件,下载文件,显示目录,改变目录,退出等功能
【实例截图】
【实例截图】
【核心代码】
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.*; import java.util.ArrayList; import java.io.File; public class server { ServerSocket ss = null; String dir = "";//显示目录 String cmd = ""; DataOutputStream dos; String direcFile = ""; File rootDirectory; String shareFile; DataInputStream dis ; //ArrayList <File> fileArrayList = new ArrayList <File>(); ArrayList<File> fileArrayList = new ArrayList<File>(); private String shareFiledirectory; public static void main(String[] args) { //System.out.println("等待连接"); new server("D:\\Backup\\我的文档\\网络课程设计共享文件"); } public server(String shareFiledirectory){ this.shareFiledirectory = shareFiledirectory; //建立套接字 try { ss = new ServerSocket(8888);//建立提供服务器的端口号为8888 } catch (IOException e1) { e1.printStackTrace(); } try{ while(true){ boolean flag = true; while(flag){ Socket s = ss.accept();//阻塞式,等待客户端请求连接 System.out.println("已有客户端连接"); //接受对方的要求: dis = new DataInputStream(new BufferedInputStream(s .getInputStream()));//BufferedInputStream 利用缓冲区来提高读效率, // 从此套接字读取字节的输入流 //BufferedInputStream(InputStream in) 参数in指定需要被装饰的输入流 cmd= dis.readUTF();//从dis输入流读取若干字节,把它转换为采用UTF-8字符编码的字符串,并将其放在cmd String变量里 //UTF-8对ASCII字符采用一个字节形式的编码,对非ASCII字符则采用两个或两个以上字节形式的编码 dis.close();//关闭输入流 s.close();//关闭socket System.out.println("输出读入的字符串:" cmd); // System.out.println(cmd=="get"); //接受后放在cmd里用于判断: if(cmd.equals("get")) get(); else if(cmd.equals("put")) put(); else if(cmd.equals("cd")) cd (); else if(cmd.equals("dir")) dir(); else if(cmd == "quit") flag = false; } } }catch (IOException e){ } } public void get(){ System.out.println("get" 1111); Socket s = null;//连接为空 try{ s = ss.accept(); //接受对方的要求的文件名: dis = new DataInputStream(new BufferedInputStream(s .getInputStream()));// String filePath = dis.readUTF();// System.out.println(filePath); //传输文件: dos = new DataOutputStream(new BufferedOutputStream(s.getOutputStream())); File file = new File(filePath); dos.writeUTF(file.getName()); dos.flush(); dos.writeLong(file.length()); dos.flush(); dis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath))); int BUFSIZE = 8192; byte [] buf = new byte[BUFSIZE]; while(true){ int read = 0; if(dis != null){ read = dis.read(buf); }else{ System.out.println("no file founded!"); break; } if (read == -1){ break; } dos.write(buf, 0, read); } dos.flush(); }catch(IOException e){ System.out.println("asdfsssssssssss"); }finally{ try{ dos.close(); dis.close(); s.close(); }catch(IOException e){ } } } public void put(){ System.out.println("put"); Socket s = null; try{ s = ss.accept(); //下载文件 dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));//从客户端接收存放上传文件路径的输出流 int bufferSize = 8192; // 缓冲区 byte[] buf = new byte[bufferSize]; int passedlen = 0; long len = 0; String savePath = "E:/上传"; // 获取文件名称 保存上传 文件的路径名 savePath = savePath File.separator dis.readUTF(); //在本地路径建一个数据流 DataOutputStream fileOut = new DataOutputStream( new BufferedOutputStream( new FileOutputStream(savePath))); // 获取文件长度 len = dis.readLong(); //从输入流 中读取8个字节 System.out.println("文件的长度为:" len " KB"); System.out.println("开始接收文件!"); // 获取文件 while (true) { int read = 0; if (dis != null) { read = dis.read(buf); //从输入流将数据读到缓冲区中,并将返回结果赋给read } passedlen = read; if (read == -1) { break; } System.out.println("文件接收了" (passedlen * 100 / len) "%"); fileOut.write(buf, 0, read); } System.out.println("接收完成,文件存为" savePath); fileOut.close(); dis.close(); s.close(); }catch(IOException e ){ } } public void cd(){ System.out.println("cd"); Socket s = null; try{ s = ss.accept(); //读取要到达的改变的目录: dis = new DataInputStream(new BufferedInputStream(s .getInputStream())); shareFile = dis.readUTF(); System.out.println(shareFiledirectory); dir(); }catch(IOException e){ }finally{ } } public void dir ( ) throws IOException{ rootDirectory = new File(shareFiledirectory);//shareFiledirectory表示共享文件的路径 fileArrayList.clear(); //String[] myList;//定义一个字符串数组 //myList = rootDirectory.listFiles(); //for(int i = 0;i<myList.length;i ){ // System.out.println(myList[i]); //} //catch(Exception e){ // e.printStackTrace(); //} //} /* File f=new File(shareFiledirectory); File[] list=f.listFiles(); for(int i=0;i<list.length;i ) System.out.println(list[i].getAbsolutePath());//打印全路径*/ initFileArrayList(); for(int i =0;i<fileArrayList.size();i ){ System.out.println(fileArrayList.get(i).getAbsolutePath()); direcFile = direcFile fileArrayList.get(i).getAbsolutePath() '\n'; } try{ Socket s = ss.accept(); dos = new DataOutputStream( new BufferedOutputStream(s.getOutputStream())); byte []buf = direcFile.getBytes(); dos.write(buf); dos.flush(); dos.close(); s.close(); }catch(IOException e){ } } public void initFileArrayList() { // 将目录下所有文件放在一个数组列表里面fileArrayList if (rootDirectory.isDirectory()) { // 遍历目录下面的文件和子目录 File[] fileList = rootDirectory.listFiles(); System.out.println(fileList.length); for (int i = 0; i < fileList.length; i ) { // 如果是文件,添加到文件列表中 if (fileList[i].isFile()) { fileArrayList.add(new File(fileList[i].getAbsolutePath())); System.out.println(fileList[i].getAbsolutePath()); System.out.println("添加了" fileList[i].getName()); } // 否则递归遍历子目录 else if (fileList[i].isDirectory()) { System.out.println("文件"); fileList[i].mkdir();// rootDirectory = fileList[i]; initFileArrayList(); } } } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论