在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于LwIP的HTTP客戶端設計

CHANBAEK ? 來源:木南創智 ? 作者:尹家軍 ? 2022-12-14 15:19 ? 次閱讀

前面我們實現了TCP服務器和客戶端的簡單應用,接下來我們實現一個基于TCP協議的應用協議,那就是HTTP超文本傳輸協議

1 HTTP****協議簡介

超文本傳輸協議(Hyper Text Transfer Protocol),簡稱HTTP,是一種基于TCP的應用層協議,也是目前為止最為流行的應用層協議之一,可以說HTTP協議是萬維網的基石。

HTTP是一種客戶端請求、服務器應答式的應用層傳輸協議,也就是說服務器端是不可能主動向客戶端發送數據的。在網絡正常的情況下請求和響應都是一一對應的。而這個請求和響應也就是后端開發人員經常看到的Request和Response。

首先,我們來看客戶器端的請求,HTTP請求報文由請求行、請求頭、空白行以及請求體組成。其報文格式如下:

我們來說一說請求行,它由請求方法字段、URL字段和HTTP協議版本字段3個字段組成,它們用空格分隔。需要理解的是請求方法,HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT幾種。先對常用的幾種說明如下:

  • GET****方法 ,意思是獲取URL指定的資源,這個請求方式是最簡單的也是最常用的。使用GET 方法時,可以將請求參數和對應的值附加在 URI 后面,利用一個問號(“?”)將資源的URI和請求參數隔開,參數之間使用與符號(“&”)隔開,因此傳遞參數長度也受到了限制,而且與隱私相關的信息也直接暴露在URI中。比如/index.jsp?username=holmofy&password=123123
  • HEAD****方法 ,與GET用法相同,但沒有響應體,使用場合沒有GET多。比如下載前使用HEAD發送請求,通過ContentLength響應字段,來了解網絡資源的大小;或者通過LastModified響應字段來判斷本地緩存資源是否要更新。
  • POST****方法 ,一般用提交信息或數據,請求服務器進行處理(例如提交表單或者上傳文件)。表單使用POST相對GET來說還是比較隱秘的,而且GET的URL有長度限制,而上傳大文件就必須要使用POST了。
  • OPTIONS****方法 ,該方法用于請求服務器告知其支持哪些其他的功能和方法。通過OPTIONS 方法,可以詢問服務器具體支持哪些方法,或者服務器會使用什么樣的方法來處理一些特殊資源。可以說這是一個探測性的方法,客戶端通過該方法可以在不訪問服務器上實際資源的情況下就知道處理該資源的最優方式。這個選項在跨域HTTP請求的情況出現的比較多,這里有一片關于跨域請求的文章,其中有一張圖很好的解釋了什么是跨域HTTP請求。

客戶端發出HTTP請求,服務端接收后,會向客戶端發送響應信息。所以接下來,我們來看看服務器端的響應報文。HTTP響應報文由響應行、響應頭、空白行以及響應體組成。其報文格式如下:

在響應報文中,非常重要的就是響應行,其中響應行中最重要的就是HTTP的狀態碼。HTTP協議中狀態碼有三位數字組成,第一位數字定義了響應的類別,有以下五種:

  • 1XX :信息提示。表示請求已被服務器接受,但需要繼續處理,范圍為100~101。
  • 2XX :請求成功。服務器成功處理了請求。范圍為200~206。
  • 3XX :客戶端重定向。重定向狀態碼用于告訴客戶端瀏覽器,它們訪問的資源已被移動,并告訴客戶端新的資源位置。客戶端收到重定向會重新對新資源發起請求。范圍為300~305。
  • 4XX :客戶端信息錯誤。客戶端可能發送了服務器無法處理的東西,比如請求的格式錯誤,或者請求了一個不存在的資源。范圍為400~415。
  • 5XX :服務器出錯。客戶端發送了有效的請求,但是服務器自身出現錯誤,比如Web程序運行出錯。范圍是500~505。

我們開發過程有一些狀態碼比較常見,我們對其簡單說明如下:

2 HTTP****客戶端設計

我們已經說過了,HTTP協議是基于TCP運行的,那么佷顯然我們要實現一個HTTP客戶端其本質上首先是要實現一個TCP客戶端。

在實現TCP客戶端的基礎上,我們要讓這個客戶端能夠實現HTTP協議的基本操作。所以我們需要為客戶端構造請求報文。關于請求報文的格式前面已經介紹過了,我們根據這個格式來構造,因為我們只是簡單的一個HTTP客戶端測試,所以我們采用GET方法。我們構造報文如下:

"GET https://www.cnblogs.com/foxclever/ HTTP/1.1\\r\\n"

"Host:www.cnblogs.com:80\\r\\n\\r\\n";

對于HTTP協議具有專門的端口號,所以我們采用這個制定的端口號來實現。而實現的流程與一般TCP客戶端是一樣的。

3 HTTP****客戶端實現

經過上述的分析以及我們前面實現TCP客戶端的經驗,實現HTTP客戶端已經沒有問題。與TCP客戶端一般,我們將HTTP客戶端分成4個函數來實現。首先依然是實現HTTP客戶端的初始化:

1 /* HTTP客戶端初始化配置*/
 2  void Http_Client_Initialization(void)
 3 {
 4   struct tcp_pcb *tcp_client_pcb;
 5   ip_addr_t ipaddr;
 6  
 7   /* 將目標服務器的IP寫入一個結構體,為pc機本地連接IP地址 */
 8 IP4_ADDR(&ipaddr,httpServerIP[0],httpServerIP[1],httpServerIP[2],httpServerIP[3]);
 9  
10   /* 為tcp客戶端分配一個tcp_pcb結構體    */
11   tcp_client_pcb = tcp_new();
12  
13   /* 綁定本地端號和IP地址 */
14   tcp_bind(tcp_client_pcb, IP_ADDR_ANY, TCP_HTTP_CLIENT_PORT);
15  
16   if (tcp_client_pcb != NULL)
17   {
18     /* 與目標服務器進行連接,參數包括了目標端口和目標IP */
19     tcp_connect(tcp_client_pcb, &ipaddr, TCP_HTTP_SERVER_PORT, HTTPClientConnected);
20    
21     tcp_err(tcp_client_pcb, HTTPClientConnectError);
22   }
23 }

我們很容易發現,上述初始化的代碼其實就是TCP客戶端的初始化代碼,除了所使用的端口不一樣外,其它都一樣。也是在初始化代碼中實現了兩個函數的注冊:一是使用tcp_connect注冊連接完成的處理回調函數;二是使用tcp_err注冊了連接錯誤處理回調函數。很明顯接下來我們需要實現這兩個函數。

連接到服務器成功后的回調函數是tcp_connected_fn類型。在客戶端建立一個連接后,內核會調用這個函數。在這個函數中,客戶端回想服務器發送最初的操作請求,并且會在這個函數中注冊數據接收處理回調函數。

1 /* HTTP客戶端連接到服務器回調函數 */
 2 static err_t HTTPClientConnected(void *arg, struct tcp_pcb *pcb, err_t err)
 3 {
 4   char clientString[]="GET https://www.cnblogs.com/foxclever/ HTTP/1.1\\r\\n"
 5 
 6                   "Host:www.cnblogs.com:80\\r\\n\\r\\n";
 7  
 8   /* 配置接收回調函數 */
 9   tcp_recv(pcb, HTTPClientCallback);
10  
11   /* 發送一個建立連接的問候字符串*/
12   tcp_write(pcb,clientString, strlen(clientString),0);
13  
14   return ERR_OK;
15 }

這個代碼也是與普通TCP客戶端一樣,只是為了應用于HTTP協議,我們發送的請求字符串需要按照HTTP的格式來設定。對HTTP客戶端連接服務器錯誤回調函數,它是tcp_err_fn類型,在這個程序中主要完成連接異常結束時的一些處理,可以釋放一些必要的資源。在這個函數被內核調用時,連接實際上已經斷開,相關控制塊也已經被刪除。所以在這個函數中我們可以重新初始化連接及其資源。在這里我們就是使用它來重新初始化TCP客戶端。

1 /* HTTP客戶端連接服務器錯誤回調函數 */
2 static void HTTPClientConnectError(void *arg, err_t err)
3 {
4   /* 重新啟動連接 */
5   Http_Client_Initialization();
6 }

最后我們需要實現的是HTTP客戶端接收到數據后的數據處理回調函數。這個函數其實就是我們前面連接成功時,注冊過的HTTP客戶端數據接收處理函數。這個函數是tcp_recv_fn類型。這是使用RAW API實現HTTP客戶端功能最重要的一個函數,因為它決定HTTP客戶端的具體功能。

1 /* HTTP客戶端接收到數據后的數據處理回調函數 */
 2 static err_t HTTPClientCallback(void *arg, struct tcp_pcb *pcb, struct pbuf *tcp_recv_pbuf, err_t err)
 3 {
 4   struct pbuf *tcp_send_pbuf;
 5   char echoString[]="GET https://www.cnblogs.com/foxclever/ HTTP/1.1\\r\\n"
 6 
 7                  "Host:www.cnblogs.com:80\\r\\n\\r\\n";
 8  
 9   if (tcp_recv_pbuf != NULL)
10   {
11     /* 更新接收窗口 */
12     tcp_recved(pcb, tcp_recv_pbuf->tot_len);
13  
14     /* 將接收到的服務器內容回顯*/
15     tcp_write(pcb,echoString, strlen(echoString), 1);
16     tcp_send_pbuf = tcp_recv_pbuf;
17     tcp_write(pcb, tcp_send_pbuf->payload, tcp_send_pbuf->len, 1);
18  
19     pbuf_free(tcp_recv_pbuf);
20   }
21   else if (err == ERR_OK)
22   {
23     tcp_close(pcb);
24     Http_Client_Initialization();
25  
26     return ERR_OK;
27   }
28  
29   return ERR_OK;
30 }

同樣,這段代碼也是除了要按HTTP協議構造響應信息外,其他部分與普通TCP客戶端類似。

4 、結論

與前一篇實現HTTP服務器是基于TCP服務器實現的一樣,這里我們實現HTTP客戶端是基于TCP客戶端來實現的。在我們前面已經實現TCP客戶端的情況下,開發HTTP客戶端應用就顯得簡單了。在這一篇我們基于LwIP實現了一個簡單的HTTP客戶端應用,我們并對其進行了簡單的測試。再歷程中我們只是實現了GET方法,但經測試設計是正確的。如果需要設計其他方法的HTTP應用只需在此基礎上添加即可。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9247

    瀏覽量

    85731
  • HTTP
    +關注

    關注

    0

    文章

    510

    瀏覽量

    31356
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1374

    瀏覽量

    79157
  • 客戶端
    +關注

    關注

    1

    文章

    290

    瀏覽量

    16724
  • LwIP
    +關注

    關注

    2

    文章

    87

    瀏覽量

    27248
收藏 人收藏

    評論

    相關推薦

    stm32 +lwip1.3.1客戶端異常導致網絡ping不通怎么解決?

    stm32上運行lwip作為服務器,如果客戶端異常了,發現在客戶端再也ping不通 網絡如果異常,交換機掛了,重啟后,客戶端怎么都ping不通stm32 有沒有遇到同樣的問題? 不是
    發表于 04-22 07:30

    ucos2中lwip tcp做客戶端

    我用的是lwip1.40,我照著官網上l.40的tcp服務器例程寫的代碼,感覺還行,隨時可以鏈接,斷開后,也可以連接,但我自己寫的客戶端,先鏈接 在斷開,在鏈接就不能通訊數據了,就是沒有重連機制,有沒有大神有具有重連機制的客戶端
    發表于 06-17 16:35

    lwip客戶端不能傳輸串口的動態數據

    lwip客戶端例程的基礎上修改回調函數 聲明一個全局sendbuf[50],把串口的數據放在sendbuf[]中,通過lwIP tcp_poll發送,打開網絡調試助手和串口調試助手調試,發現
    發表于 06-27 03:55

    如何解決lwip的netconn客戶端發送問題

    我的板子做客戶端,用的lwip,現在在與服務器連接成功后,發送有個問題1,在網絡調試助手中設置20ms不停發送1字節,板子客戶端在接收到服務器的數據后,直接返回數據, 總共發送10000字節,調試
    發表于 07-15 04:36

    LWIP作服務器連接第一個客戶端后,以后的客戶端就連接不上

    我用的F407,UCOSII+LWIP作為服務器,現在情況是如果客戶端只有一個的話連接是正常的,但是如果第一個客戶端連接上,以后的客戶端就連接不上了。原子的教程沒有這方面的內容,不知道
    發表于 03-06 04:35

    請問LWIP TCPserver支持多個客戶端連接嗎?

    有些郁悶 來向壇友詢問了LWIP TCPserver能做出來 就是使用原子的例程改的但無法支持多個客戶端的連接有人寫出多個客戶端可以連接的server程序嗎? 分享下代碼 不用把整個工程發出來
    發表于 03-15 23:23

    怎樣去設計嵌入式LWIP網絡客戶端

    嵌入式LWIP網絡客戶端設計教程本文引用地址: 嵌入式技術的興起使得傳統的基于PC機的互聯網技術優勢不再,嵌入式網絡客戶端與服務技術成為熱點,而該技術需要移植性高、占用資源小的協議棧
    發表于 08-06 06:46

    stm32f107vc lwip tcp客戶端

    stm32f107vc lwip tcp客戶端 服務器數據傳輸第一篇TCP客戶端模式簡單數據收發 ----控制開發板LED燈概要建立LWIP客戶端
    發表于 08-06 09:17

    一個HTTP協議客戶端源代碼資料免費下載

    本文檔的主要內容詳細介紹的是一個簡單的HTTP協議客戶端源代碼資料免費下載。
    發表于 10-18 17:49 ?7次下載
    一個<b class='flag-5'>HTTP</b>協議<b class='flag-5'>客戶端</b>源代碼資料免費下載

    嵌入式LWIP網絡客戶端設計資料下載

    電子發燒友網為你提供嵌入式LWIP網絡客戶端設計資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發表于 04-11 08:52 ?11次下載
    嵌入式<b class='flag-5'>LWIP</b>網絡<b class='flag-5'>客戶端</b>設計資料下載

    STM32+LWIP服務器實現多客戶端連接

    用過正點原子LWIP服務器例程開發的朋友可能知道,例程的設計是只支持一個客戶端連接的,但實際應用中往往需要用到多客戶端連接。下面是在正點原子擴展例程 網絡實驗14 NETCONN_TCP 服務器
    發表于 12-23 19:59 ?61次下載
    STM32+<b class='flag-5'>LWIP</b>服務器實現多<b class='flag-5'>客戶端</b>連接

    適用于Java的Google HTTP客戶端庫使用教程

    介紹 由 Google 編寫的用于 Java 的 Google HTTP 客戶端庫是一個靈活、高效且功能強大的 Java 庫,用于通過 HTTP 訪問網絡上的任何資源。圖書館有以下 特征: 可插入
    發表于 04-12 10:33 ?3次下載

    基于LwIP的TCP客戶端設計

    上一篇我們基于LwIP協議棧的RAW API實現了一個TCP服務器的簡單應用,接下來一節我們來實現一個TCP客戶端的簡單應用。
    的頭像 發表于 12-14 15:12 ?2318次閱讀
    基于<b class='flag-5'>LwIP</b>的TCP<b class='flag-5'>客戶端</b>設計

    HTTP客戶端快速入門指南

    HTTP客戶端快速入門指南
    發表于 01-12 18:45 ?0次下載
    <b class='flag-5'>HTTP</b><b class='flag-5'>客戶端</b>快速入門指南

    HTTP客戶端快速入門指南

    HTTP客戶端快速入門指南
    發表于 07-03 18:38 ?0次下載
    <b class='flag-5'>HTTP</b><b class='flag-5'>客戶端</b>快速入門指南
    主站蜘蛛池模板: 天天干天天上| 欧美婷婷| 视频在线观看免费网站| 8050午夜一级二级全黄| 男人不识本站| 亚洲 欧美 另类 综合 日韩 | 日本五十交尾在线观看| 日本高清视频不卡| www.色黄| 欧美一级特黄aaaaaa在线看首页| 国内真实实拍伦视频在线观看| 四虎永久免费网站免费观看| 狠狠gao| 欧美性受xxxx| 一级做a爰片久久毛片毛片| 波多野结衣福利| 深夜影院一级毛片| 爱爱免费视频网站| 黄色免费网站在线| 人人叉人人| 天堂网成人| 亚洲欧美日韩综合一区| 午夜dy888理论| 久久男人视频| 国产网站大全| 手机在线1024| 午夜在线看片| 97色资源| 成人拍拍视频| 国模私拍在线视频| 美女三级在线| 欧美人成在线观看| 婷婷狠狠| 亚洲欧美国产视频| 一级做a爰片久久毛片美女图片| 男男浪荡性受高hnp肉| 99pao强力打造免费高清色| 2019天天爱天天做| 国产精品成人一区二区三区| 毛片在线播放网址| 啪啪伊人网|