1. 程式人生 > >Java基礎進階Day11

Java基礎進階Day11

Java基礎進階Day11

課程大綱

1、網路程式設計基礎知識 --------------------> 瞭解(兩種架構、三種要素)
2、TCP通訊流程 -------------------------> 重點(理解服務端和客戶端互動流程步驟)
3、檔案上傳綜合案例 --------------------> 理解(理解程式碼實現步驟,注意點)

第一章 網路程式設計基礎知識

1、兩種軟體架構(核心由javaweb階段介紹)
A、BS架構 
	a.含義
		B:Browser瀏覽器
		S:Server伺服器
	b.舉例
		淘寶網站、京東商城、博學谷、百度搜索、CSDN論壇、網頁小遊戲
	c.
特點 直接使用瀏覽器,訪問網站,就可以進去 B、CS架構 a.含義 C:Client客戶端 S:Server伺服器 b.舉例 QQ軟體、迅雷軟體、酷狗音樂、LOL遊戲 c.特點 需要下載客戶端,安裝客戶端,才能使用
2、網路程式設計三要素(課堂畫圖分析問題 快遞案例)
A、IP地址 (ipv4和ipv6)
		a.檢視IP地址的指令 ipconfig
		b.本地預設IP地址 127.0.0.1
    
B、埠號 
		a. 埠號 範圍是 0~65535
		b. 其中 0~1024 屬於系統埠,不要使用
	
C、通訊協議
        a.TCP協議
            傳輸資料大
            安全性高
            速度慢
        b.
UDP協議 傳輸資料小 64KB 安全性低 速度快

第二章 TCP通訊流程

1、客戶端(傳送資料)操作步驟
A. Socket clickSocket = new Socket("IP地址",埠號); //建立Socket的物件
B. OutputStream os = clickSocket.getOutputStream(); //獲取IO流物件(輸出)
C. os.write("需要寫入的資料"); //寫資料,可以進行流的增強
D. os.close(); //釋放資源
2、服務端(接收資料)操作步驟
A.
ServerSocket serverSocket = new ServerSocket(埠號); //建立ServerScoket物件 B. Socket clientSocket = serverSocket.accept(); //連線客戶端Socket物件 C. InputStream is = clickSocket.getInputStream(); //獲取IO流物件(輸入) D. int ch = is.read(); //讀資料,可以進行流的增強 E. is.close(); //釋放資源
3、服務端(回覆資料)操作步驟
A. OutputStream os = clientSocket.getOutputStream(); //獲取IO流物件(輸出) 
B. os.write("需要寫回的資料"); 	//寫資料,可以進行增強流 
C. os.close();  		 		//釋放資源 
D. clickSocket.close();  		//關閉客戶端socket  
4、客戶端(接收資料)操作步驟
A. InputStream is = clickSocket.getInputStream(); //獲取IO流物件(輸入)
B. int ch = is.read(); 	 //讀資料  可以進行流的增強 
C. is.close(); 			//釋放資源
D. clickSocket.close();  //關閉客戶端socket
5、注意事項
A.採用 BufferedReader 和 BufferedWriter 進行讀寫操作. 
    BufferedWriter 每次寫完一個數據,需要換行和重新整理.才能被 BufferedReader 讀取得到
	原因是: BufferedReader 採用 readLine()讀取資料的結束條件是 "遇到換行符結束"

B.客戶端的 Socket 和 服務端獲取客戶端Socket要匹配上
	客戶端的 Socket ----- 匹配到 ---> 服務端的 serverSocket.accept();

第三章 檔案上傳綜合案例

1、圖片檔案上傳伺服器、基礎版本的程式碼流程
客戶端硬碟檔案 -> 檔案讀取 -> 客戶端寫出 -> 服務端讀取 -> 服務端寫出 -> 服務端硬碟檔案
2、相關程式碼的優化處理
A、服務端檔案以毫秒值命名的處理問題
	  long time = System.currentTimeMillis();

B、客戶端通知伺服器資料書寫完畢
	  clickSocket.shutdownOutput();
3、多執行緒版本服務端優化
//獲取服務端的ServerSocket的物件
ServerSocket serverSocket = new ServerSocket(埠號);
//死迴圈.不斷的開啟獲取單獨客戶端的連線
while(true){
        //獲取客戶端的Socket
        Socket clientSocket = serverSocket.accept();
        //開啟執行緒,可以採用lambda表示式
        new Thread(()->{ 
                try{
                    //編寫以前的程式碼.獲取IO流物件...釋放資源
                }catch(IOException e){
                    e.printStackTrace();
                } 
        }).start();
}