简易文件服务器

Java提供接口实现客户端下载文件

一、简介

通过循环实现多个客户端同时连接服务端下载文件,利用文件输入输出流来实现服务端和客户端的数据交互。以便完成文件在双方的顺利传输。

二、具体思路

将文件路径存入动态数组中再放入一个指定文件中,利用线程实现控制文件下载。而客户端只需要做好数据接受和传递简单的数字数据来实现这边的文件筛选,以达到文件列表选择下载的目的。

三具体实现代码

服务端代码:

public class FLServer extends Thread {
	private static ArrayList<String> list;
	private static ArrayList<FileM> list3;
	private static File f;
	private static Socket sk;
	static FileM fm;
	static int g;
	public FLServer(int g, ArrayList<FileM> list3, Socket sk) {
		super();
		this.g = g;
		this.list3 = list3;
		this.sk = sk;
	}
	@Override
	public void run() {
		for (FileM fm : list3) {
			if (fm.getId() == g) {
				File fl = fm.getF();
				try {
					RandomAccessFile raf = new RandomAccessFile(fl, "r");
					OutputStream op = sk.getOutputStream();
					BufferedOutputStream bop = new BufferedOutputStream(op);
					byte[] b = new byte[1024];
					int len = 0;
					System.out.println("开始下载....");
					while ((len = raf.read(b)) != -1) {
						bop.write(b, 0, len);
					}
					System.out.println("下载完成!!!");
					raf.close();
					bop.close();
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	public static ArrayList<FileM> read(File f, ArrayList<FileM> list2) {
		list = new ArrayList<String>();
		if (f.isDirectory()) {
			File[] files = f.listFiles();
			int index = 1;
			for (File fl : files) {
				list.add(index + ":" + fl.getName());
				fm = new FileM(index, fl);
				list2.add(fm);
				index++;
			}
		} else {
			list.add(f.getName());
		}
		return list2;
	}
	public static Integer msgInput(InputStream is) {
		BufferedReader bf = new BufferedReader(new InputStreamReader(is));
		int j;
		String sd = "";
		try {
			while ((sd = bf.readLine()) != null) {
				j = Integer.parseInt(sd);
				return j;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return 0;
	}
	public static void main(String[] args) throws IOException {
		ServerSocket s = new ServerSocket(5555);
		f = new File("C:\\Program Files\\feiq\\Recv Files\\20190730\\video");
		ObjectOutputStream oos = null;
		ObjectInputStream ios = null;
		list3 = new ArrayList<FileM>();
		System.out.println("服务已启动,等待连接。。。");
		while (true) {
			sk = s.accept();
			System.out.println(sk.getInetAddress().getHostAddress() + "用户已连接,请输入要下载的文件id");
			OutputStream os = sk.getOutputStream();
			oos = new ObjectOutputStream(os);
			list3 = read(f, list3);
			oos.writeObject(list);
			oos.flush();
			// oos.close();
			g = msgInput(sk.getInputStream());
			if (g != 0) {
				new FLServer(g, list3, sk).start();
			}
		}
	}
}

 客户端:

public class Test {
	public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException {
		Socket s = new Socket("192.168.4.109",5555);
		InputStream is = s.getInputStream();
		ObjectInputStream ois = new ObjectInputStream(is);
		Object o = ois.readObject();
		ArrayList<String> list = (ArrayList<String>) o;
		System.out.println(list);
		Scanner sc = new Scanner(System.in);
		OutputStream os = s.getOutputStream();
		OutputStreamWriter osw = new OutputStreamWriter(os);
		os.write(sc.nextInt());
		os.flush();
		os.close();
		BufferedInputStream bis =new BufferedInputStream(is);
		FileOutputStream fos = new FileOutputStream("d:/javacode/1.avi");
		byte[] b = new byte[1024];
		int len=0;
		while((len=bis.read(b))!=-1){
			fos.write(b, 0, len);
		}
		System.out.println("搞定");
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值