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("搞定");
}
}