首页 > 其他分享 >基于服务器响应的实时天气数据进行JSON解析的详细代码及其框架

基于服务器响应的实时天气数据进行JSON解析的详细代码及其框架

时间:2024-06-11 23:11:03浏览次数:29  
标签:recvbuf include addr cJSON tcp JSON 服务器 解析 socket

#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include "cJSON.h"

#define PORT 80  //端口号
#define IPADDR "116.62.81.138"//地址

#define KEY "SNGgI2upxur590NHn" // 私钥
#define LOCAL "beijing" //城市

int main(int argc, char const *argv[])
{
    // 1.创建TCP套接字
    int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
    //错误处理
    if (tcp_socket == -1)
    {
        fprintf(stderr, "tcp socket error,errno:%d,%s\n", errno, strerror(errno));
        exit(1);
    }
    // 2.发起连接请求,等待接受服务器接受连接
    struct sockaddr_in dest_addr;
    dest_addr.sin_family = AF_INET;                // 协议族,是固定的
    dest_addr.sin_port = htons(PORT);              // 服务器端口,必须转换为网络字节序
    dest_addr.sin_addr.s_addr = inet_addr(IPADDR); // 服务器地址
    //ret用来进行下一步的connect连接是否成功进行判断
    int ret = connect(tcp_socket, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
    //ret = 0连接成功,ret = -1连接失败
    if (ret < 0)
    {
        fprintf(stderr, "connect error,errno:%d,%s\n", errno, strerror(errno));
        exit(1);
    }
    // 3.用于存储HTTP的请求内容: 请求行(HRI+(空格))+ 请求字段 + \r\n + 请求包体(可选)+\r\n
    char reqbuf[1024] = {0};
    sprintf(reqbuf, "GET https://api.seniverse.com/v3/weather/now.json?key=%s&location=%s&language=en&unit=c "
                    "HTTP/1.1"
                    "\r\n"
                    "Host:api.seniverse.com\r\n"
                    "\r\n",
            KEY, LOCAL);

    // 4.说明双方建立连接,此时可以利用HTTP协议发送请求信息,并等待服务器的响应  基于请求/响应
    send(tcp_socket, reqbuf, strlen(reqbuf), 0);

    // 5.等待服务器的响应
    char recvbuf[1024] = {0};

    recv(tcp_socket, recvbuf, sizeof(recvbuf), 0); // 第一次返回的响应参数
    printf("%s", recvbuf);
    bzero(recvbuf, 1024);

    recv(tcp_socket, recvbuf, sizeof(recvbuf), 0); // 第二次返回的响应包体
    printf("%s\n", recvbuf);

    // 6.对响应包体进行JSON解析

    // 1) 先把获取的字符串转换为JSON格式
    cJSON *obj = cJSON_Parse(recvbuf);

    // 2) 把解析之后的JSON格式进行输出,用于调试
    printf("%s\n", cJSON_Print(obj));

    // 3) 对JSON格式进行解析
    cJSON *results = NULL;
    results = cJSON_GetObjectItem(obj, "results");
    printf("array size = %d\n", cJSON_GetArraySize(results));

    // 4)对城市的实时温度数据进行解析
    cJSON *result = NULL;
    cJSON_ArrayForEach(result, results)
    {
    cJSON *now = cJSON_GetObjectItem(result, "now");
    cJSON *temperature = cJSON_GetObjectItem(now, "temperature");

    printf("temperature : %s\n", temperature->valuestring);

    printf("temperature : %d\n", atoi(temperature->valuestring));
    }

    return 0;
}

标签:recvbuf,include,addr,cJSON,tcp,JSON,服务器,解析,socket
From: https://www.cnblogs.com/LvYaoNan/p/18242985

相关文章

  • Rustdesk 自建服务器
    自建rustdesk远程终端服务器,解决稳定远程控制需求。1、购买腾讯云服务器,99一年2、修改登录终端用户,默认使用ubuntu账户登录,存在权限限制,不能够上传文件Ubuntu系统如何使用root用户登录实例?(https://cloud.tencent.com/document/product/213/17278#ubuntu-.E7.B3.BB.E7.......
  • http与cJSON练习
    http与cJSON练习/*****************************************************************************************************weather_test.c*练习tcp连接,与http协议,调用服务器接口,实现获取特定城市的天气信息,并用cJSO......
  • 多进程并发简易服务器代码实现
    多进程实现并发服务器多进程并发服务器.c架构intsockfd=socket()bian()listen()while(1){ acceptfd=accept() pid=fork() if(pid>0){ }elseif(pid==0){ while(1){ recv()/send() } }}注意:accept不能放在P......
  • 利用聚合API平台的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJ
    目录题目分析代码结果题目利用聚合API平台的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJSON库对服务器的响应数据进行解析,并输出到终端分析1.需从源代码网站GitHub或SourceForge代码网站下载cJSON库及阅读下载的README相关手册如何使用cJSON库;2.使用......
  • 网络编程练习题---利用cJSON库对服务器返回的JSON格式数据完成解析
    目录题目注意事项实现代码结果展示相关接口指引题目利用某些平台(聚合API、百度AI、科大讯飞API)的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJSON库对服务器的响应数据进行解析,并输出到终端。注意事项1.预测的日期开始时间为2010-01-012."老黄历"API......
  • cJSON学习及简单应用小结
    JSON简介JSON(JavaScriptObjectNotation,JavaScript对象表示法)是一种轻量级的数据交换格式。它基于ECMAScript(欧洲计算机制造商协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。以下是JSON......
  • 探索Java的奥秘:网络编程、反射与注解的深度解析
    Java,作为一门功能强大的编程语言,在网络编程、反射和注解方面提供了丰富的支持和灵活的应用。本文将深入探讨这些概念,并通过实际例子来加深理解。一、Java网络编程1.1网络编程基础网络编程是Java语言的一大亮点,它允许我们创建能够通过网络进行通信的程序。Java提供了java......
  • 基于centos7.9搭建http文件服务器
    基于centos7.9搭建http文件服务器1.安装httpd[root@localhost~]#yuminstall-yhttpd2.关闭防火墙以及selinux[root@localhost~]#systemctlstopfirewalld&&setenforce03.修改相关配置​ 文件/etc/httpd/conf/httpd.conf中的默认参数(自定义修改)[root@loca......
  • fastjson1
    @目录前言分析复制文件清空文件出现问题和分析问题解决分析问题再次出现问题再次分析最终结果读取文件分析poc拓宽场景极限环境poc优化修改再次优化poc的分析写入文件SafeFileOutputStream写文件java8无依赖读文件在commons-io库下的写入文件原因利用链分析组合poc出现问题和分析......
  • 深入解析MySQL Threads_running:监控、诊断与性能优化策略
    基本概念​在MySQL中,Threads_running是一个用于监控数据库并发连接数的指标。它表示当前正在执行的线程数。当该值超过数据库能够处理的最大连接数时,可能会导致数据库性能下降甚至崩溃。线程数过多会由于上下文切换、锁等待等问题从而导致性能急剧下降。设置Threads_......