1. 程式人生 > >【Java筆記】TCP上傳圖片案例分析

【Java筆記】TCP上傳圖片案例分析

要求:從客戶端上傳一張圖片到伺服器,伺服器將圖片儲存在指定資料夾中,伺服器反饋上傳成功。

(本質是檔案複製,只要有資料來源和資料目的即可)

客戶端:資料來源是電腦某碟符下的某張照片

              資料目的是伺服器

伺服器:資料來源是客戶端

              資料目的是某碟符下的某個資料夾

----------------------------------------------------------------------------------------------------------------------------------------------------

客戶端

1.Socket套接字連線伺服器

2.通過Socket獲取位元組輸出流,寫圖片

3.使用定義的流物件(FileInputStream),讀取圖片資料來源

4.讀取圖片,使用位元組輸出流,將圖片寫到伺服器

5.通過Socket套接字獲取位元組輸入流,並讀取伺服器回饋的“上傳成功”

6.關閉資源

/*
 * 檔案上傳 客戶端
 * 
 * public void shutdownOutput()  禁用此Socket的輸出流,間接的相當於告知了伺服器資料寫入完畢
 */
public class TCPClient {
	public static void main(String[] args) throws IOException {
		//2,建立客戶端Socket,連線伺服器
		Socket socket = new Socket("192.168.74.58", 8888);
		//3,獲取Socket流中的輸出流,功能:用來把資料寫到伺服器
		OutputStream out = socket.getOutputStream();
		//4,建立位元組輸入流,功能:用來讀取資料來源(圖片)的位元組
		BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream("D:\\NoDir\\test.jpg"));
		//5,把圖片資料寫到Socket的輸出流中(把資料傳給伺服器)
		byte[] buffer = new byte[1024];
		int len = -1;
		while ((len = fileIn.read(buffer)) != -1){
			//把資料寫到Socket的輸出流中
			out.write(buffer, 0, len);
		}
		//6,客戶端傳送資料完畢,結束Socket輸出流的寫入操作,告知伺服器端
		socket.shutdownOutput();

		//-----------------反饋資訊---------------------
		//12,獲取Socket的輸入流  作用: 讀反饋資訊
		InputStream in = socket.getInputStream();
		//13,讀反饋資訊
		byte[] info = new byte[1024];
		//把反饋資訊儲存到info陣列中,並記錄位元組個數
		int length = in.read(info);
		//顯示反饋結果
		System.out.println( new String(info, 0, length) );
		
		//關閉流
		in.close();
		fileIn.close();
		out.close();
		socket.close();
	}
}

----------------------------------------------------------------------------------------------------------------------------------------------------

伺服器端

1.ServerSocket套接字物件,監聽埠號8888

2.方法accept()獲取客戶端的連線物件

3.客戶端連線物件獲取位元組輸入流,讀取客戶端傳送的圖片

4.建立File物件,繫結資料夾,判斷資料夾,不存在則建立

5.建立位元組輸出流,資料目的File物件封裝的資料夾

6.位元組流讀取圖片,位元組流將圖片寫入到目的資料夾中

7.將“上傳成功”回饋給客戶端

8.關閉資源

/*
 * 檔案上傳  伺服器端
 *
 */
public class TCPServer {
	public static void main(String[] args) throws IOException {
		//1,建立伺服器,等待客戶端連線
		ServerSocket serverSocket = new ServerSocket(8888);
		Socket clientSocket = serverSocket.accept();
		//顯示哪個客戶端Socket連線上了伺服器
		InetAddress ipObject = clientSocket.getInetAddress();//得到IP地址物件
		String ip = ipObject.getHostAddress(); //得到IP地址字串
		System.out.println("小樣,抓到你了,連線我!!" + "IP:" + ip);
		
		//7,獲取Socket的輸入流
		InputStream in = clientSocket.getInputStream();
		//8,建立目的地的位元組輸出流   D:\\upload\\192.168.74.58(1).jpg
		BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream("D:\\upload\\192.168.74.58(1).jpg"));
		//9,把Socket輸入流中的資料,寫入目的地的位元組輸出流中
		byte[] buffer = new byte[1024];
		int len = -1;
		while((len = in.read(buffer)) != -1){
			//寫入目的地的位元組輸出流中
			fileOut.write(buffer, 0, len);
		}
		
		//-----------------反饋資訊---------------------
		//10,獲取Socket的輸出流, 作用:寫反饋資訊給客戶端
		OutputStream out = clientSocket.getOutputStream();
		//11,寫反饋資訊給客戶端
		out.write("圖片上傳成功".getBytes());
		
		out.close();
		fileOut.close();
		in.close();
		clientSocket.close();
		//serverSocket.close();
	}
}