服务端:
package project_7.fileserver;
import java.io.*;
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) {
super();
this.s = s;
}
public void setDir(File dir) {
this.dir = dir;
}
@Override
public void run() {
/**
* 1.获取目录中所有文件列表 2.将文件发送给客户端 3.接受客户端的指令(需要下载的文件编号)
* 4.根据文件编号找到指定的文件并获取文件的输入流 5.获取客户端Socket的输出流将读取的文件内容写出去
*/
try {
// 1.
File[] files = dir.listFiles();
// 准备map集合已编号-》文件的方式存储文件信息
Map<String, File> map = new HashMap<>();
for (int i = 0; i < files.length; i++) {
map.put(String.valueOf(i + 1), files[i]);
}
// 2.
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
// 发送对象到客户端Socket中
oos.writeObject(map);
// 3.
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String no = br.readLine();
// 4.
File target = map.get(no);
@SuppressWarnings("resource")
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(target));
// 5.
// 基于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);
}
bos.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (s != null) {
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端:
package project_7.fileserver;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException {
//连接到指定地址指定端口服务
Socket s = new Socket("192.168.4.254",7777);
//获取基于Socket的对象输入流(Map)
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
//读取一个对象
Map<String,File> map = (Map<String,File>)ois.readObject();
//获取map集合中的键集
Set<String> keys = map.keySet();
//获取set对象的迭代器
Iterator<String> 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();
}
}