java编写实现网络文件传输功能

package com.softeem.fileserver;

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

/**
 * 服务器
 */
public class Server {

	public static void main(String[] args) throws IOException {
		
		File dir = new File("D:\\teach\\express\\J1806\\课程\\part2-java高级\\20180726\\video");
		//创建一个服务
		ServerSocket ss = new ServerSocket(7777);
		System.out.println("Softeem文件服务器已启动...");
		while(true){
			//监听一个客户端连接
			Socket s = ss.accept();
			System.out.println("客户端连接:"+s.getInetAddress());
			//针对当前产生的Socket开启文件服务
			FileService fs = new FileService(s);
			//设置目标目录
			fs.setDir(dir);
			//启动服务
			fs.start();
		}
	}
}



package com.softeem.fileserver;

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.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * 提供文件服务的类(多线程服务)
 */
public class FileService extends Thread{

	private Socket s;
	private File dir;
	
	public FileService(Socket s){
		this.s = s;
	}

	public void setDir(File dir) {
		this.dir = dir;
	}
	
	@Override
	public void run() {
		BufferedInputStream bis = null;
		try {
			//1.获取目录中的所有文件列表
			File[] files = dir.listFiles();
			//准备map集合以编号->文件的方式存储文件信息
			Map map = new HashMap<>();
			for(int i = 0;i map = (Map)ois.readObject();
		//获取map集合中的键集
		Set keys = map.keySet();
		//获取set对象的迭代器
		Iterator it = keys.iterator();
		//迭代
		while(it.hasNext()){
			//获取迭代器中的一个元素
			String key = it.next();
			//根据键获取值
			File value = map.get(key);
			System.out.println(key+"----"+value.getName());
		}
		System.out.println("请输入需要下载的文件编号:");
		//获取基于控制台标准输入流,读取指令
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String no = br.readLine();
		//根据编号或许需要下载的文件的文件名
		String fname = map.get(no).getName();
		
		//发送指令到服务器
		PrintWriter pw = new PrintWriter(s.getOutputStream());
		pw.println(no);
		pw.flush();
		
		//准备本地文件的输出流,存储来自socket的输入流中文件数据
		BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fname));
		byte[] b = new byte[1024];
		int len = 0;
		System.out.println("开始下载...");
		while((len = bis.read(b)) != -1){
			bos.write(b,0,len);
		}
		System.out.println("下载完成!");
		s.close();
		bos.close();
		br.close();
	}
}

 

你可能感兴趣的:(java编写实现网络文件传输功能)