1、创建一个服务器,提供目录下载
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务器
* @author dell
*
*/
public class Server {
public static void main(String[] args) throws IOException {
File dir=new File("F:");
//创建一个服务
ServerSocket ss=new ServerSocket(9797);
System.out.println("Softeem文件服务器已启动。。。");
while(true){
//监听一个客户端连接
Socket s=ss.accept();
System.out.println("客户端已经连接,,");
//针对当前产生的Socket开启文件服务
FileService fs=new FileService(s);
fs.setDir(dir);
fs.start();
}
}
}
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;
/**
* 提供文件服务的夹
* @author dell
*
*/
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;
BufferedOutputStream bos=null;
try {
//1、获取目录中的所有文件列表
File[] filer=dir.listFiles();
//准备一个map集合以编号对应文件的方式存取文件信息
Map<String, File> map=new HashMap<>();
for (int i = 0; i < filer.length; i++) {
map.put(String.valueOf(i+1), filer[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);
bis=new BufferedInputStream(new FileInputStream(target));
//5、获取客户端Socket的输出流将读取的文件内容写出去
//获取基于socket的输出流,向客户端发送文件数据
bos=new BufferedOutputStream(s.getOutputStream());
byte[] b=new byte[1024];
int len=0;
while((len=bis.read(b))!=-1){
bos.write(b, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(s!=null){
s.close();
}
if(bis!=null){
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2、创建一个客户端选择下载文件
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Clint {
public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException {
//连接到制定地址指定端口服务
Socket s=new Socket("192.168.*.***", 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();
}
}