本實驗是實現一個簡易天氣預報客戶端。可查看最近三天天氣預報。
使用一些常用天氣API數據實現數據的解析。此處我是用心知天氣(),其IP地址為:116.62.81.138 使用端口號:80 傳輸協議TCP
網頁信息一般使用GET或POST獲取,此處查看心知天氣開發文檔可知,使用GET方法。
網頁傳輸過來的數據一般使用json格式進行傳輸,我們需要對其進行解析,然后再依次展示出來。
部分代碼如下:
static int cJSON_NowWeatherParse(char *JSON,Weather *result); int main(int argc, char *argv[]) { int sockfd,sendbytes; char buf[BUFFER_SIZE]; char GetRequestBuf[256]={0}; char WeatherRecvBuf[1024]={0}; char weather_json[20]=NOW_JSON; char location[20]="shanghai"; Weather *result; struct hostent *host; struct sockaddr_in serv_addr; memset(buf,0,sizeof(buf)); sockfd=socket(AF_INET,SOCK_STREAM,0); serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(PORT); serv_addr.sin_addr.s_addr=inet_addr(WEATHER_IP_ADDR); //bzero(&(serv_addr.sin_zero),8); if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1){ perror("connect fail!"); } sprintf(GetRequestBuf,GET_RRQUEST_PACKAGE,weather_json,KEY,location); if((sendbytes=send(sockfd,GetRequestBuf,strlen(GetRequestBuf),0))==-1){ perror("send fail"); } recv(sockfd,WeatherRecvBuf,1024,0); printf("Server return data is:\n %s\n",WeatherRecvBuf); /* 解析天氣數據並保存到結構體變量weather_data中 */ if (0 == strcmp(weather_json, NOW_JSON)) // 天氣實況 { cJSON_NowWeatherParse(WeatherRecvBuf, result); } else if(0 == strcmp(weather_json, DAILY_JSON)) // 未來三天天氣 { //cJSON_DailyWeatherParse(GbkRecvBuf, result); } close(sockfd); return 0; }
部分實現,本人還在編寫,此處做個記錄,未完待續...