一、文件上傳分析圖解
(1)【客戶端】輸入流,從硬盤讀取文件數據到程序中。
(2)【客戶端】輸出流,寫出文件數據到服務端。
(3)【服務端】輸入流,讀取文件數據到服務端程序。
(4)【服務端】輸出流,寫出文件數據到服務器硬盤中。
二、客戶端實現
文件上傳案例的客戶端:讀取本地文件,上傳到服務器,讀取服務器回寫的數據
明確:
數據源存在 c:\\1.jpg
目的地:服務器
實現步驟:
(1)創建一個本地字節輸入流FileInputStream對象,構造方法中綁定要讀取的數據源
(2)創建一個客戶端Socket對象,構造方法中綁定服務器的IP地址和端口號
(3)使用Socket中的方法getOutputStream,獲取網絡字節輸出流OutputStream對象
(4)使用本地字節輸入流FileInputStream對象中的方法read,讀取本地文件
(5)使用網絡字節輸出流OutputStream對象中的方法write,把讀取到的文件上傳到服務器
(6)使用Socket中的方法getInputStream,獲取網絡字節輸入流InputStream對象
(7)使用網絡字節輸入流InputStream對象中的方法read讀取服務回寫的數據
(8)釋放資源(FileInputStream,Socket)
public class FileUpload_Client {
public static void main(String[] args) throws IOException {
//1.創建一個本地字節輸入流FileInputStream對象,構造方法中綁定要讀取的數據源
FileInputStream fis = new FileInputStream("D:\\1.jpg");
//2.創建一個客戶端Socket對象,構造方法中綁定服務器的IP地址和端口號
Socket socket = new Socket("127.0.0.1",8888);
//3.使用Socket中的方法getOutputStream,獲取網絡字節輸出流OutputStream對象
OutputStream os = socket.getOutputStream();
//4.使用本地字節輸入流FileInputStream對象中的方法read,讀取本地文件
int len = 0;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes))!=-1){
//5.使用網絡字節輸出流OutputStream對象中的方法write,把讀取到的文件上傳到服務器
os.write(bytes,0,len);
}
//6.使用Socket中的方法getInputStream,獲取網絡字節輸入流InputStream對象
InputStream is = socket.getInputStream();
//7.使用網絡字節輸入流InputStream對象中的方法read讀取服務回寫的數據
while((len = is.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
//8.釋放資源(FileInputStream,Socket)
fis.close();
socket.close();
}
}
三、服務端實現
文件上傳案例服務器端:讀取客戶端上傳的文件,保存到服務器的硬盤,給客戶端回寫"上傳成功"
明確:
數據源:客戶端上傳的文件
目的地:服務器的硬盤 d:\\upload\\1.jpg
實現步驟:
(1)創建一個服務器ServerSocket對象,和系統要指定的端口號
(2)使用ServerSocket對象中的方法accept,獲取到請求的客戶端Socket對象
(3)使用Socket對象中的方法getInputStream,獲取到網絡字節輸入流InputStream對象
(4)判斷d:\\upload文件夾是否存在,不存在則創建
(5)創建一個本地字節輸出流FileOutputStream對象,構造方法中綁定要輸出的目的地
(6)使用網絡字節輸入流InputStream對象中的方法read,讀取客戶端上傳的文件
(7)使用本地字節輸出流FileOutputStream對象中的方法write,把讀取到的文件保存到服務器的硬盤上
(8)使用Socket對象中的方法getOutputStream,獲取到網絡字節輸出流OutputStream對象
(9)使用網絡字節輸出流OutputStream對象中的方法write,給客戶端回寫"上傳成功"
(10)釋放資源(FileOutputStream,Socket,ServerSocket)
public class FileUpload_Server {
public static void main(String[] args) throws IOException {
//1.創建一個服務器ServerSocket對象,和系統要指定的端口號
ServerSocket server = new ServerSocket(8888);
//2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端Socket對象
Socket socket = server.accept();
//3.使用Socket對象中的方法getInputStream,獲取到網絡字節輸入流InputStream對象
InputStream is = socket.getInputStream();
//4.判斷d:\\upload文件夾是否存在,不存在則創建
File file = new File("d:\\upload");
if(!file.exists()){
file.mkdirs();
}
//5.創建一個本地字節輸出流FileOutputStream對象,構造方法中綁定要輸出的目的地
FileOutputStream fos = new FileOutputStream(file+"\\1.jpg");
//6.使用網絡字節輸入流InputStream對象中的方法read,讀取客戶端上傳的文件
int len =0;
byte[] bytes = new byte[1024];
while((len = is.read(bytes))!=-1){
//7.使用本地字節輸出流FileOutputStream對象中的方法write,把讀取到的文件保存到服務器的硬盤上
fos.write(bytes,0,len);
}
//8.使用Socket對象中的方法getOutputStream,獲取到網絡字節輸出流OutputStream對象
//9.使用網絡字節輸出流OutputStream對象中的方法write,給客戶端回寫"上傳成功"
socket.getOutputStream().write("上傳成功".getBytes());
//10.釋放資源(FileOutputStream,Socket,ServerSocket)
fos.close();
socket.close();
server.close();
}
}