網絡編程&Http協議&Tomcat模擬
網絡編程
1、計算機網絡
概述:將各個地理位置的計算機通過外部設備連接在一起形成的系統網絡
作用:實現數據的共享,信息的傳遞
IP地址:IP地址是計算機的唯一表示,要連接計算機依靠的是IP地址,一個網絡環境中不可以有兩個相同IP地址的電腦(IP地址衝突)
Port端口:要連接一臺計算機用IP,要連接計算機中的某一個程序,用端口區分;一臺計算機中不允許有兩個相同端口號的程序(端口號衝突)
域名:eg. www開頭網址,實際訪問過程中不適用IP,而是使用域名,因爲IP地址不好記
URL:統一資源定位符
2、獲取網頁數據
URL和XML解析
3、通信
TCP傳輸控制協議
1.可靠傳輸協議(安全性高)
2.每次通信之前都要連接一次(雙向連接),三次握手,四次揮手
3.基於流的傳輸
4.傳輸效率低
UDP用戶數據協議
1.不可靠傳輸協議(不太安全)
2.基於數據報的傳輸
3.傳輸效率較高
TCP編程
1.服務端ServerScoket
accept():監聽客戶端的連接(是一個阻塞方法:監聽到客戶端的連接就解除阻塞)
2.客戶端Scoket
獲取輸入流:用於讀
獲取輸出流:用於寫
TCP通信案列
步驟
1.先創建服務器(指定端口)
2.監聽客戶端的連接(accept())
3.創建客戶端(IP + 端口號),並連接服務器
4.服務器監聽到客戶端之後返回一個Scocket對象
5.讓服務端循環監聽客戶端的接入
6.讓客戶端給服務端發送一句話
7.服務端返回客戶端
HTTP協議
1.協議:指定了數據傳送的一些規範
2.Tcp/ip協議:是傳輸/網絡層的協議:注重數據的傳輸
3.ttp協議:是應用層的協議,注重數據的包裝
4.分類:
1.Http1.0
一次連接,一次請求,一次響應
2.Http1.1
長連接狀態,一次連接(多次請求,多次響應)
效率提升了
5.請求request
1.請求行(請求方法 uri 協議的版本)
2.請求頭(告訴服務器的一些信息)
3.請求體
get請求的請求體沒有東西
post請求如果有數據提交,數據就放在此處
6.響應response
1.響應行/狀態行(協議版本 狀態碼 狀態描述)
2.響應頭(告訴瀏覽器的一些信息)
3.響應體:響應給請求的一些數據(html,image,json,xml,string)
7.Get和Post區別
1.Get請求會將請求的參數放在地址欄上
不安全
數據有大小限制
什麼時候會發送get請求
直接在地址欄中輸入地址
表單的默認提交
超鏈接
2.Post請求將請求參數放在請求體中
相對安全
數據沒有限制(文件上傳必須用post請求)
什麼時候會發送post請求
設置表單的method屬性值爲post
Tomcat模擬
public class TomcatServer {
private ServerSocket server;
public TomcatServer() throws IOException {
System.out.println("初始化服務器");
server = new ServerSocket(8088);
// 執行業務方法(將login.html頁面用流的寫出去)
System.out.println("服務器初始化成功");
start();
server.close();
}
public void start() throws IOException {
// 1.監聽客戶端的連接
Socket socket = server.accept();
// 創建輸入流,用於讀取文件
File file = new File("D:/Java/WebWorkspace/2019_8_16_html&css/WebContent/08_homework.html");
FileInputStream in = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(isr);
// 創建輸出流
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out, "UTF-8");
PrintWriter pw = new PrintWriter(osw, true);
// 將數據打包
pw.println("HTTP/1.1 200 OK");
pw.println("Content-Type: text/html;charset=utf-8");
pw.println("Content-Length:" + file.length());
pw.println();
// 複製(讀一行,寫一行)
String len = null;
while ((len = br.readLine()) != null) {
pw.println(len);
}
pw.close();
br.close();
}
public static void main(String[] args) throws IOException {
while (true) {
new TomcatServer();
}
}
}