简单模拟客户端向服务器上传文件---这里就用本机模拟
分析:
步骤:1.客户端:提示输入要上传的文件路径,验证路径是否粗壮乃以及是否是文件夹,如果是文件路径就继续
2.客户端:发送文件名字到服务器
3.服务器:建立多线程服务器
4.服务器:读取文件名
5.服务器:判断文件是否在服务器上已经存在,如果存在告诉客户端存在,并终止程序;不存在就继续
6.客户端:接受服务器返回来的判断文件的结果,如果存在,就给予提示并推出程序;如果不存在,就定义字节输入 流将文件读取,然后再写出到网络中
7.服务器:从网络中读取数据,定义字节输出流,将从网络读取的数据写到本地
服务器端的代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo06_Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(12345);
System.out.println("服务器启动,绑定12345端口");
//读取文件名
while(true) {
final Socket socket = server.accept(); //服务器接受请求
new Thread() { //多线程服务器,接受请求后就开启一条线程
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(socket.getOutputStream());
String fileName = bf.readLine();
//判断文件是否存在
File dir = new File("update");
dir.mkdir(); //创建文件夹
File file = new File(dir, fileName); //封装成file对象
if(file.exists()) { //如果服务器已经存在这个文件,将存在写给客户端
ps.println("存在");
socket.close(); //因为存在了,下面的代码就没必要执行了,关闭socket
return;
}else {
ps.println("不存在");
}
//定义FileOutputStream,将从网络读取的数据存储到本地
FileOutputStream fos = new FileOutputStream(file);
byte[] arr = new byte[8192];
int len;
while((len=is.read(arr))!=-1) {
fos.write(arr, 0, len);
}
fos.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
}
客户端部分的代码
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Demo06_Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//提示输入要上传的文件路径,验证路径是否存在并且是否是文件夹
File file = getFiel();
//发送文件到服务器
Socket socket = new Socket("127.0.0.1", 12345);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println(file.getName());
//接受返回的结果,如果存在,给与提示并退出程序;如果不存在,读取文件,写出到网络
String result = br.readLine(); //读取存在或不存在的结果
if("存在".equals(result)) {
System.out.println("您上传的文件已经存在,请不要重复上传");
socket.close();
return;
}
FileInputStream fis = new FileInputStream(file);
byte [] arr = new byte[8192];
int len;
while((len=fis.read(arr))!=-1) {
ps.write(arr, 0, len);
}
fis.close();
socket.close();
}
private static File getFiel() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件路径:");
while(true) {
String line = sc.nextLine();
File file = new File(line);
if(!file.exists()) {
System.out.println("你输入的路径不存在,请重新输入");
}else if(file.isDirectory()) {
System.out.println("你输入的是一个文件夹路径,不是文件,请重i性能输入");
}else {
return file;
}
}
}
}