局域网内服务端提供一个目录,客户端选择指定文件并进行下载

来源:互联网 发布:三维人像建模软件 编辑:程序博客网 时间:2024/05/29 13:10
package com.softeem.example.ftp;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.ObjectOutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.TreeMap;public class FtpServer extends Thread{private File dir;// 需要被共享的目录private Socket s;// 当前链接的客户端public FtpServer(File dir, Socket s) {super();this.dir = dir;this.s = s;}@Overridepublic void run() {//1.将目录中文件列表传输到客户端sendList();}private void sendList(){//列出目录中所有的文件名称String[] filesName = dir.list();//将文件名以键值对形式存储到map集合中TreeMap<Integer,String> files = new TreeMap<>();for (int i = 0; i < filesName.length; i++) {files.put(i+1, filesName[i]);}try {//获取基于Socket的对象输出流(通过socket向客户端发送文件列表)ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());oos.writeObject(files);oos.flush();//接收指令receiveCommond(files);} catch (IOException e) {e.printStackTrace();}}//接受指令private void receiveCommond(TreeMap<Integer,String> files) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));String s = br.readLine();int fno = Integer.parseInt(s);String fname = files.get(fno);//根据共享目录以及客户端需要下载文件名,创建File对象File source = new File(dir,fname);//发送文件trasFile(source);}//传输文件private void trasFile(File source) throws IOException{System.out.println("开始传输...");//获取源文件的输入流BufferedInputStream bis = new BufferedInputStream(new FileInputStream(source));//获取socket的输出BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());byte[] b = new byte[1024];int len = 0;while((len = bis.read(b)) != -1){bos.write(b, 0, len);}bis.close();bos.close();System.out.println("传输完成!");}public static void main(String[] args) {try {//声明被共享的目录对象File dir = new File("D:\\素材\\视频\\larva搞笑虫子");System.out.println("服务器已启动...");ServerSocket ss = new ServerSocket(5678);Socket s = null;while(true){//7*24h监听客户端链接s = ss.accept();System.out.println("客户端已连接,开始提供服务:"+s.getInetAddress().getHostAddress());//针对没一个链接的Socket对象单独开启一个线程提供文件共享服务new FtpServer(dir, s).start();;}} catch (IOException e) {e.printStackTrace();}}}


阅读全文
0 0
原创粉丝点击