文章目錄
需求
搭建環境
編寫http客戶端代碼
注意點
測試結果
點擊下方閱讀原文可訪問文中超鏈接
需求
前面已經移植好了協議棧netx,也完成了UDP通信的測試,說明移植方面應該是沒有其它什么問題了。準備開展后續的工作,因為需求的原因,我需要將板子作為http客戶端來請求web服務器的數據,然后處理及顯示。
搭建環境
開始時我打算用以前學習的goahead來搭建web服務器,然后進行測試,但是沒有調試成功,web服務器運行在我的ubuntu中,抓包的時候發現從我的主機(windows)到ubuntu有連續的往來數據包,但都是SYN包,沒有ACK等后面的數據包,http客戶端返回狀態也是未連接,以為是web服務器運行在ubuntu的原因,所以就放棄了。然后在網上下載了一個http服務器工具,這個工具可以搭建一個簡單的web服務器,詳細見下圖:
測試的html文件內容如下,保存為index.html,直接拖動到測試工具中即可:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Home Page</title>
</head>
<body>
<p>Congratulations! The server is up and running.<p/>
</body>
</html>
在瀏覽器中輸入網址訪問一下,或者點擊工具IP地址欄左邊的Open in browser,如果能訪問到html文件內的內容就說明web服務器搭建成功了。
編寫http客戶端代碼
參考netx源碼目錄的http例程(netx\samples\demo_netx_http.c),這個例程是官方用于模擬測試的例程,里面有server端和client端的代碼,提取出其中的client端代碼,添加到自己的工程中,主要代碼如下:
/*創建一個http客戶端實例*/
/* Create an HTTP client instance. */
status = nx_http_client_create(&my_client, "HTTP Client", get_nx_ip_handle(), get_packet_pool_handle(), 600);
/*更改端口*/
nx_http_client_set_connect_port(&my_client,HTTP_SERVER_PORT);
for(;;)
{
/*發送一個get請求,獲取web服務器的指定內容*/
/* Use the 'NetX' service to send a GET request to the server (can only use IPv4 addresses). */
status = nx_http_client_get_start(&my_client, HTTP_SERVER_ADDRESS, "/index.html",
NX_NULL, 0, NX_NULL, NX_NULL, 50);
/* Check status. */
if (status == NX_NOT_CONNECTED)
{
/*如果狀態是未連接則重新發送請求*/
tx_thread_sleep(1000);
continue;
}
else if (status == NX_SUCCESS)
{
/*請求成功,獲取數據包*/
status = nx_http_client_get_packet(&my_client,&packet_ptr,10);
if(status == NX_SUCCESS)
{
/*得到數據包的長度*/
nx_packet_length_get(packet_ptr,&len);
/*打印數據包的內容*/
PRINTF("len:%d\r\n%s\r\n",len,packet_ptr->nx_packet_prepend_ptr);
/*釋放數據包*/
nx_packet_release(packet_ptr);
}
break;
}
}
/*釋放客戶端實例資源*/
nx_http_client_delete(&my_client);
http客戶端的創建很簡單,只需要幾行代碼就可以完成。
注意點
使用nx_http_client_set_connect_port更改端口地址時,這個傳入的端口地址不需要進行大小端轉換,可能我開始使用goahead測試的時候一直未連接就是這個問題導致的。
通過源碼得知,http使用的版本應該是HTTP/1.0,用的是短連接的方式。
測試結果
本文只測試了get請求,未測試post,但也只是接口不一樣而已。
本文源碼獲取:點我獲取本文源碼[threadx\threadx_netx_http_client_Demo]
參考文檔:
HTTP長連接與短連接