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;
}
@Override
public 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();
}
}
}