成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

跟著小白一起學鴻蒙--]簡單Http客戶端(十二)

系統 OpenHarmony
HTTP 是一個基于 TCP/IP 通信協議來傳遞數據(HTML 文件、圖片文件、查詢結果等)。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

在《#跟著小白一起學鴻蒙# [二] 第一個OpenHarmony程序》我們熟悉了如何在開源鴻蒙開發應用,并通過hdc工具拷貝至開發板運行。但是那時候我們只是打印了最簡單的hello world,接下來我們就講開發最常用的部分,一個簡單的http客戶端;

概述

  • HTTP 是一個基于 TCP/IP 通信協議來傳遞數據(HTML 文件、圖片文件、查詢結果等)。
  • HTTP是一個屬于應用層的面向對象的協議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統。它于1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規范化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經提出。
  • HTTP協議工作于客戶端-服務端架構為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求后,向客戶端發送響應信息。

HTTP請求消息Request

  • 請求數據結構如下

#沖刺創作新星# #跟著小白一起學鴻蒙# [十二]簡單Http客戶端-開源基礎軟件社區

  • 一個Get的sample

在瀏覽器輸入www.baidu.com然后回車即可看到瀏覽器顯示了百度的頁面,按F12可以看到具體內容:

#沖刺創作新星# #跟著小白一起學鴻蒙# [十二]簡單Http客戶端-開源基礎軟件社區

??上圖里我們可以看到在請求的url是www.baidu.com??,請求的方法是GET,服務器的IP地址是180.101.49.14:443(https,若是http就是80)。

  • 一個Post的sample

#沖刺創作新星# #跟著小白一起學鴻蒙# [十二]簡單Http客戶端-開源基礎軟件社區

  • 上圖里我們可以看到在請求的url是https://cysz.hopethink.com/qhhsd/app/getH5HsdList,請求的方法是POST,服務器的IP地址是114.215.124.251:443(https,若是http就是80),請求內容類型application/x-www-form-urlencoded;charset=UTF-8,請求數據長度84,請求數據keyword=&streetId=&pageNum=1&pageSize=1&ip=222.95.30.84。

此樣例參考小熊派設計,使用小熊派HM_Micro開發板進行驗證。

應用開發流程

graph LR
建立build.gn --> 建立helloworld.c --> 添加httpget --> 添加httppost --> 驗證

建立Build.gn。

import("http://build/lite/config/component/lite_component.gni")

executable("hello_world_lib") {
output_name = "hello_world"
sources = [ "hello_world.c" ]
include_dirs = []
defines = []
cflags_c = []
ldflags = []
}
lite_component("my_app") {
features = [
":hello_world_lib",
]
}

建立helloworld.c。

#include <stdio.h>
int main(int argc, char **argv)
{
printf("\n************************************************\n");
printf("\n\t\tHello httpget!\n");
printf("\n************************************************\n\n");
return 0;
}

添加httpget。

int sockfd, ret, i, h;
struct sockaddr_in servaddr;
char str1[BUF_SIZE], str2[BUF_SIZE], buf[BUF_SIZE], *str;
socklen_t len;
fd_set t_set1;
struct timeval tv;
//創建套接字
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
printf("create socket failed--- exit(0)!\n");
exit(0);
};
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
if (inet_pton(AF_INET, IPSTR_GET, &servaddr.sin_addr) <= 0 ){
printf("inet_pton failed --- exit(0)!\n");
exit(0);
};
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
printf("connect failed, exit(0)!\n");
exit(0);
}
printf("connect remote server\n");
memset(str2, 0, BUF_SIZE);
strcat(str2, "theDataToGet");
str=(char *)malloc(BUF_SIZE);
len = strlen(str2);
sprintf(str, "%d", len);
//請求頭部內容
memset(str1, 0, BUF_SIZE);
strcat(str1, "GET / HTTP/1.1\n");
strcat(str1, "Host: www.baidu.com\n");
strcat(str1, "Content-Type: text/html\n");
strcat(str1, "Content-Length: ");
strcat(str1, str);
//請求空行
strcat(str1, "\n\n");
//請求參數
strcat(str1, str2);
strcat(str1, "\r\n\r\n");
printf("%s\n",str1);
ret = write(sockfd,str1,strlen(str1));
if (ret < 0) {
printf("socket write failed! errcode%d,errmsg'%s'\n",errno, strerror(errno));
exit(0);
}else{
printf("socket write %d bytes!\n\n", ret);
}
FD_ZERO(&t_set1);
FD_SET(sockfd, &t_set1);
while(1) {
sleep(2);
h = 0;
h = select(sockfd +1, &t_set1, NULL, NULL, &tv);
if (h < 0) {
close(sockfd);
printf("SELECT error, return -1!\n");
return -1;
};

if (h > 0){
memset(buf, 0, BUF_SIZE);
i= read(sockfd, buf, BUF_SIZE);
if (i==0){
close(sockfd);
printf("read 0, return -1!\n");
return -1;
}
printf("%s\n", buf);
}
}
close(sockfd);
return 0;

httppost:

int sockfd, ret, i, h;
struct sockaddr_in servaddr;
char str1[BUF_SIZE], str2[BUF_SIZE], buf[BUF_SIZE], *str;
socklen_t len;
fd_set t_set1;
struct timeval tv;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
printf("create sockt failed---exit(0)!\n");
exit(0);
};

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
if (inet_pton(AF_INET, IPSTR_POST, &servaddr.sin_addr) <= 0 ){
printf("inet_pton failed---exit(0)!\n");
exit(0);
};
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
printf("connect server failed, exit(0)!\n");
exit(0);
}
printf("connect to server\n");
memset(str2, 0, BUF_SIZE);
strcat(str2, "keyword=&streetId=&pageNum=1&pageSize=1&ip=222.95.30.84");
str=(char *)malloc(BUF_SIZE);
len = strlen(str2);
sprintf(str, "%d", len);
//請求頭部內容
memset(str1, 0, BUF_SIZE);
strcat(str1, "POST /qhhsd/app/getH5HsdList HTTP/1.1\n");
strcat(str1, "Host: cysz.hopethink.com\n");
strcat(str1, "Content-Type: application/x-www-form-urlencoded\n");
strcat(str1, "Content-Length: ");
strcat(str1, str);
//請求空行
strcat(str1, "\n\n");
//str2的值為post的數據
strcat(str1, str2);
strcat(str1, "\r\n\r\n");
printf("%s\n",str1);
ret = write(sockfd,str1,strlen(str1));
if (ret < 0) {
printf("socket write failed! errcode%d, errmsg'%s'\n",errno, strerror(errno));
exit(0);
}else{printf("socket write %d bytes\n\n", ret);
}
FD_ZERO(&t_set1);
FD_SET(sockfd, &t_set1);
tv.tv_sec= 0;
tv.tv_usec= 0;
h= 0;
while(1) {
sleep(2);
h = select(sockfd +1, &t_set1, NULL, NULL, &tv);
if (h == -1) {
close(sockfd);
printf("select error, return -1\n");
return -1;};
if ( FD_ISSET(sockfd, &t_set1) ){
memset(buf, 0, BUF_SIZE);
i= read(sockfd, buf, BUF_SIZE);
if (i==0){
close(sockfd);
printf("read 0, return -1!\n");
return -1;
}
printf("%s\n", buf);}
}
close(sockfd);
return 0;

在main里增加方法和頭文件。

  • 頭文件

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define IPSTR_GET "180.101.49.14" //服務器IP地址,上面查出來的;
#define IPSTR_POST "114.215.124.251"

#define PORT 80
#define BUF_SIZE 4096

  • 方法

httpget();
httppost();

測試結果:

Get測試結果:

Post測試結果:

總結

  1. http是建立在socket之上的數據結構化應用協議,可以通過拼socket包實現所有功能。
  2. 之后我們可以利用此接口實現一個核算地圖的界面應用。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??。

責任編輯:jianghua 來源: 51CTO開源基礎軟件社區
相關推薦

2022-12-02 14:20:09

Tetris鴻蒙

2022-11-29 16:35:02

Tetris鴻蒙

2023-03-30 09:32:27

2022-11-14 17:01:34

游戲開發畫布功能

2023-04-04 09:24:11

鴻蒙HiDumper

2022-10-10 14:47:04

藍牙應用鴻蒙

2022-10-17 14:29:24

鴻蒙應用開發

2023-02-27 16:30:32

鴻蒙開源協議分析

2023-03-30 09:19:54

SELinux安全子系統

2022-08-19 19:02:20

開源鴻蒙操作系統

2023-01-03 15:09:10

鴻蒙常用工具

2022-11-24 14:34:41

Hap程序鴻蒙

2022-12-06 15:39:16

鴻蒙主干代碼

2023-03-15 16:19:03

BinderIPC工具

2022-10-09 15:05:50

NAPI框架鴻蒙

2022-10-20 16:40:16

JS應用控制LED鴻蒙

2022-12-09 15:34:38

2022-11-28 15:42:39

分布式軟總線鴻蒙

2023-02-24 16:02:45

WebSocket網絡通訊協議

2022-12-05 15:02:14

鴻蒙用戶鑒權
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天碰夜夜操 | 亚洲免费人成在线视频观看 | 国产精品日韩在线观看一区二区 | 国产视频黄色 | 精品不卡| 国产精品久久国产精品 | 国产人成在线观看 | 中文字幕日韩欧美一区二区三区 | 69亚洲精品 | 国产亚洲一区二区精品 | 精品不卡 | www.久久 | 一区二区三区亚洲精品国 | 精品一区二区在线看 | 中文字幕中文字幕 | 91在线观看免费视频 | 欧美在线观看免费观看视频 | 99精品九九 | 成人午夜黄色 | 午夜免费网站 | 欧美黄色片在线观看 | 国产精品久久a | 国产在线观看一区二区三区 | 国内精品久久久久久久影视简单 | a免费视频 | 九久久 | 亚洲精品久久久久久久久久吃药 | 欧美aaaaaaaa| 黄色片网站在线观看 | 欧美性生交大片免费 | 亚洲九九精品 | 日日骚网| 日韩免费高清视频 | 日日操日日舔 | 亚洲免费人成在线视频观看 | 一级a性色生活片久久毛片波多野 | 国产 日韩 欧美 在线 | 天天爱综合 | 在线成人福利 | 正在播放国产精品 | 欧美手机在线 |