超级课表
項目整體介紹
項目功能:
- 注冊用戶
- 注冊用戶需要提供學校,專業,姓名
- 登錄用戶
- 登錄用戶需要提供之前注冊的學校,專業,姓名
- 查詢課表
- 查詢課表需要輸入學校,專業,班級(班級中包括了年級,例:151就是15級1班)
項目模塊:
- 1.HTTP服務器框架
- 2.業務實現
- 1.爬學校的網站
- 2.數據庫操作
- 3.頁面制作
一.多線程HTTP服務器框架
1.1 讀取請求并解析
1.1.1 解析首行(從socket中讀取到數據按空格且切分)
- 解析方法:切分出來的第一部分就是方法
- 解析出URL
- 解析URL中的path
- 解析出query_string
1.1.2 解析heade
- 解析出Content_Length
- 解析出Content_Type
1.1.3 解析header
- 請求都是表單形式所以按照表單格式解析
1.2 計算請求計算響應并寫回客戶端
1.2.1 處理靜態頁面
寫一個HTML文
1.2.2 處理動態頁面
根據頁面輸入參數不同返回不同頁面使用了CGI技術
CGI技術(通用網關接口,一種協議,一種標準)
CGI技術功能: 讓HTTP服務器的底層框架和上層應用解耦合
CGI技術優點:對編程語言的要求低(只要可以訪問標準輸入輸出就可以(SQL語言不能訪問標準輸入輸出))
CGI技術缺點:進程的頻繁創建銷毀效率低(進程池,FastCGI)
- 服務器創建子進程
- 子進程進行程序替換(替換為url_path指定的可執行程序即 CGI程序)
- CGI程序:根據業務的具體需要,獲取到用戶輸入的參數并進行動態頁面的計算
- 子進程是通過匿名管道+環境變量獲取到用戶輸入的參數
- 子進程進行重定向(把標準輸入輸出匿名管道的讀端)
- 子進程通過匿名管道(匿名管道的寫端)把計算得到的動態HTML寫會父進程
- 父進程拿到子進程結果后拼裝出一個HTTP響應
- 把響應寫回socket中
二.業務實現
2.1 爬取有用信息
2.1.1借助libcurl第三方庫實現獲取網頁的功能
- 輸入目標是URL
輸出結果是html
使用1.初始化句柄(curl_easy_init())
- 2.設置響應如何處理
- 3.發送請求
4.清理對象
2.2.2解析html文件解析出HTML中需要的專業,班級,課表
- 將解析出來的結果寫進數據庫之中的專業,班級寫入學校表
- 將解析出來的課表寫入課表中
2.2數據庫操作
2.2.1 注冊實現
- 獲取到用戶定義的參數
- 解析獲取到的參數
- 將獲取到的參數插入數據庫之中
2.2.2登錄實現
- 獲取到參數(方法,query_string,body)
- 獲取到Content_Length,再從標準輸入中讀取body
- 解析讀取到的數據
- 將讀取到的數據拼裝到查詢SQL語句中
- 執行查詢語句對學校表中的數據進行查找,
- 找到了就跳轉至搜索頁面
- 找不到就跳轉至注冊頁面
2.2.3 查詢實現
- 獲取到參數(方法,query_string,body)
- 獲取到Content_Length,再從標準輸入中讀取body
- 解析讀取到的數據
- 將讀取到的數據拼裝到查詢SQL語句中
- 執行查詢語句對課表中的數據進行查找,
- 找到了就講課表打印出來
- 找不到就提示用戶占時沒有該課表
總結
- 上一篇: 2.6 zio入门——对比Future
- 下一篇: 通俗易懂,什么是.NET?什么是.NET