Test_Java_网络编程(模拟客户端向服务器上传文件)
需求:使用Java程序创建两个类,分别为UpdateClient和UpdateServer类来模拟客户端向服务器上传文件(因为没有服务器,只能本机传给自己)
- 提示输入要上传的文件路径,验证路径是否在以及是否是文件夹
- 发送文件名到服务器
- 建立多线程的服务器
- 读取文件名
- 判断文件是否存在,将结果发回客户端
- 定义FileOutputStream,从网络读取数据,存储到本地
Test2_UpdateClient.java
package com.soar.test;
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 Test2_UpdateClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//1.提示输入要上传的文件路径,验证路径是否穿在以及是否是文件夹
File file = getFile();
//2.发送文件名到服务器
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();
//6.接收结果,如果存在给予提示,程序直接退出
String result = br.readLine(); //读取存在或者不存在的结果
if("服务器已经存在该文件".equals(result)){
System.out.println("您上传的文件已经存在,请不要重复上传");
socket.close();
return;
}
//7.如果不存在,定义FileInputStream读取文件,写出到网络
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 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;
}
}
}
}
Test2_UpdateServer.java
package com.soar.test;
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 Test2_UpdateServer {
public static void main(String[] args) throws IOException {
//3.建立多线程的服务器
ServerSocket server = new ServerSocket(12345);
System.out.println("服务器启动,绑定12345端口号");
//4.读取文件名
while(true){
final Socket socket = server.accept(); //接受请求
new Thread(){
public void run(){
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(socket.getOutputStream());
String fileName = br.readLine();
//5.判断文件是否存在,将结果发回客户端
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("不存在");
}
//8.定义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();
}
}
}