Java基礎進階Day11
阿新 • • 發佈:2018-12-22
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();
}