客户端:
package UDP;
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 Demo04_Client3 {
public static void main(String[] args) throws UnknownHostException, IOException {
File file = getFile();
/**
* 2.发送文件名到服务端
*/
Socket s = new Socket("127.0.0.1", 54321);
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintStream ps = new PrintStream(s.getOutputStream());
ps.println(file.getName());
/**
* 3.接收结果,如果存在给予提示,程序直接退出
*/
String result = br.readLine();
if ("存在".equals(result)) {
System.out.println("您上传的文件已经存在,请不要重复上传");
s.close();
return;// 代码结束执行
}
/**
* FileInputStream只能读取本地文件
* 4.如果不存在,定义FileInputStream读取文件,写出到网络 FileInputStream是字节流,可以读取任意文件,文本、音频、视频。
*/
FileInputStream fis = new FileInputStream(file);
byte[] arr = new byte[8192];// 创建一个缓冲区
int len;
while ((len = fis.read(arr)) != -1) {
ps.write(arr, 0, len);// 从这个字节数组中从0开始写len个出去到服务器端
}
fis.close();
s.close();
}
/**
* 1.提示输入要上传的文件路径,验证路径是否存在以及是否是文件夹
*
* @return
*/
private static File getFile() {
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("您录入的是文件夹路径,请输入一个文件路径");
} else {
return file;
}
}
}
}
服务端:
package UDP;
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 Demo04_Server3 {
public static void main(String[] args) throws IOException {
/**
* 1.创建多线程的服务器
*/
ServerSocket so = new ServerSocket(54321);
System.out.println("服务器启动,绑定54321端口");
/**
* BufferedReader读取的是字符 2.读取文件名
*/
while (true) {
Socket socket = so.accept();
new Thread() {
public void run() {
try {
InputStream is = socket.getInputStream();// 字节流
BufferedReader bs = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(socket.getOutputStream());
String fileName = bs.readLine();// 读取客户端传过来的文件名
// 3.判断文件是否存在,将结果返回给客户端
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("不存在");
}
// 4.定义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();
}
}
}