前言:
只需要开发工具ideal,最基础的java项目,无需任何框架。主要就是模拟网盘的功能,通过开创多个文件夹来区分服务器的空间,客户端的本地空间,话不多说先看效果图
执行步骤:
1.开启服务器
2.客户端发送文件名给服务器
3.服务器查询到该文件所包含的文件
4.服务器将包含的文件信息发送给客户端
5.客户端选择是下载还是上传
6.下载操作是从返回的文件中选择,将执行下载的文件保存到客户端下载的文件夹中
7.上传将自己已经下载过的文件上传到服务器
8.服务器将上传的文件保存到自己的文件夹中
![](https://img-blog.csdnimg.cn/d6cb3602ccfe465e9c97fcaee32db8ff.png)
![](https://img-blog.csdnimg.cn/663e98a6b6be4bc0b8952034b20e72da.png)
![](https://img-blog.csdnimg.cn/f69fa65e1f704b0e9e980d0437336173.png)
![](https://img-blog.csdnimg.cn/1c09ea4be9f24a60918b147d422cd5d4.png)
Client代码:
package com.dmdd.mywangpan;
import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
//客户端发送文件名给服务器的功能
String JSONFileNames = "";
private static final String DIR = "E:\\soft\\";
private static final String DOWN_LOAD = "E:\\myWanPanDownLoad\\";
private static final String IP = "192.168.56.1";
public void sendFileName(String ip, int port, String fileName) {
System.out.println("输入的文件名为" + fileName);
//创建client对象
try (Socket client = new Socket(ip, port)) {
//创建Object输出流 将文件名输出到服务器端
ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream());
os.writeUTF(fileName);
os.flush();
os.close();
// clientIS.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 接收文件信息合集
*
* @param ip
* @param port
*/
public void readJSONFileNames(String ip, int port) {
try (Socket client = new Socket(ip, port)) {
//创建输入流获取服务器端的Json字符串
ObjectInputStream clientIS = new ObjectInputStream(client.getInputStream());
JSONFileNames = clientIS.readUTF();
System.out.println(JSONFileNames);
clientIS.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 客户端指定返回过来的文件进行下载或者上传到服务器
*
* @param
*/
public void upload(String ip, int port, String JSONFileNames) {
Scanner scanner = new Scanner(System.in);
System.out.println("请选择是下载文件,还是上传文件,扣1下载,扣2上传");
int uploadOrDownLoad = scanner.nextInt();
//执行下载文件的操作
if (uploadOrDownLoad == 1) {
//创建保存文件的文件夹
File dir = new File(DOWN_LOAD);
if (!dir.exists()) {
System.out.println("文件不存在");
dir.mkdir();
return;
}
//将JSON字符串分隔开成数组
String[] fileNames = JSONFileNames.split(",");
System.out.println("请选择你想下载的文件");
for (int i = 0; i < fileNames.length; i++) {
System.out.println(i + 1 + fileNames[i]);
}
int select = scanner.nextInt();
//获取想要下载的文件名
String fileName = fileNames[select - 1];
File file = new File(fileName);
//创建输入流
try {
FileInputStream fileInputStream = new FileInputStream(DIR + fileName);
//创建输出流
FileOutputStream fileOutputStream = new FileOutputStream(DOWN_LOAD + fileName);
byte[] buf = new byte[1024];
int len = 0;
//边读边写
while ((len = fileInputStream.read(buf)) != -1) {
fileOutputStream.write(buf, 0, len);
}
System.out.println("文件下载成功请在" + DOWN_LOAD + fileName + "查看");
fileInputStream.close();
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//执行上传操作
else {
try (Socket client = new Socket(ip, port)) {
File file = new File(DOWN_LOAD);
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println(i + 1 + files[i].getName());
}
System.out.println("请选择您要上传的文件");
int select = scanner.nextInt();
//获取想要下载的文件名
String fileName = files[select - 1].getName();
File UploadFile = new File(fileName);
//创建输入流
FileInputStream fileInputStream = new FileInputStream(DOWN_LOAD + fileName);
//创建输出流
ObjectOutputStream objectOutputStream = new ObjectOutputStream(client.getOutputStream());
//将文件名传过去
objectOutputStream.writeUTF(fileName);
byte[] buf = new byte[1024];
int len = 0;
//边读边写
while ((len = fileInputStream.read(buf)) != -1) {
objectOutputStream.write(buf, 0, len);
}
System.out.println("文件上传成功!");
objectOutputStream.flush();
objectOutputStream.close();
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Client client = new Client();
//教室ip为 192.168.1.114
//家的ip为192.168.31.83 192.168.56.1
client.sendFileName(IP, 8080, "E:\\soft");
client.readJSONFileNames(IP, 8081);
client.upload(IP, 8083, client.JSONFileNames);
}
}
Server代码:
package com.dmdd.mywangpan;
import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Server {
private static final int PORT = 8080;
String JSONFileNames = "";
private static final String UPLOAD_DIR = "E:\\wanPanUpload\\";
/**
* 通过客户端传来的文件名 遍历该文件下面的其他文件
*/
public void serverListFiles() {
System.out.println("服务器socket启动");
//创建服务器对象
try (ServerSocket server = new ServerSocket(PORT)) {
//循环读取服务器接收客户端对象
Socket client = server.accept();
//创建对象输入流
ObjectInputStream is = new ObjectInputStream(client.getInputStream());
String fileName = is.readUTF();
//获取客户端传到的文件名
System.out.println("客户端传到的文件名为" + fileName);
//通过文件名创建文件对象
File file = new File(fileName);
//获取文件名下面的其他文件集合
File[] files = file.listFiles();
//将文件数组转换为类型为File的List数组
List Filefiles = Arrays.stream(files).collect(Collectors.toList());
//将List数组拼接为JSON字符串
//创建储存多种文件名字的json字符串
for (File file1 : Filefiles) {
String name = file1.getName();
System.out.println(name);
//拼接到JSONFileNames
JSONFileNames += name;
JSONFileNames += ",";
}
//文件1,文件2,文件3,文件4
String subStringJSON = JSONFileNames.substring(0, JSONFileNames.lastIndexOf(","));
System.out.println(subStringJSON);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 将json字符串发送给客户端
*
* @param
*/
public void sendJson(String JSONFileNames) {
try (ServerSocket serverSocket = new ServerSocket(8081)) {
Socket client = serverSocket.accept();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(client.getOutputStream());
objectOutputStream.writeUTF(JSONFileNames);
objectOutputStream.flush();
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获得上传的文件
*
* @param
*/
public void getFile() {
try (ServerSocket server = new ServerSocket(8083)) {
//判断存储上传文件的文件夹是否存在
File file = new File(UPLOAD_DIR);
if (!file.exists()) {
System.out.println("上传文件夹不存在");
file.mkdir();
}
Socket client = server.accept();
ObjectInputStream objectInputStream = new ObjectInputStream(client.getInputStream());
//获取文件名
String fileName = objectInputStream.readUTF();
//创建输出流 输出到文件夹里
FileOutputStream fileOutputStream = new FileOutputStream(UPLOAD_DIR + fileName);
byte[] buf = new byte[1024];
int len = 0;
//边读边写
while ((len = objectInputStream.read(buf)) != -1) {
fileOutputStream.write(buf, 0, len);
}
System.out.println("上传成功!请在" + UPLOAD_DIR + fileName + "查看");
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server();
server.serverListFiles();
server.sendJson(server.JSONFileNames);
server.getFile();
}
}
主要操作就是流的运用,没有啥难度,该程序是方便大伙对socket的理解。注释写的很详细了,可以直接创建两个类将代码跑起来,给同学们看看效果,装装杯。让男同学仰慕你,让女同学爱上你
|