【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();
}
}