c语言实现 windows socket_「socket应用」基于C语言的TCP天气客户端的实现

本文介绍了使用C语言在Windows下实现一个TCP天气客户端的过程,包括获取私钥、设置IP和端口、构造GET请求、解析JSON数据以及编译和运行结果。客户端通过HTTP GET请求获取天气API的数据,并使用cJson库解析JSON响应。
摘要由CSDN通过智能技术生成

7b15d959dcaee951f201876b56339aad.png

一、前言
上一篇笔记分享了,这一篇分享一个用C语言写的、基于TCP的一个HTTP天气客户端的实现,这个一个控制台应用程序,最终的界面如下:

978937ba35119b4e4758f6f89a8f08d8.png


二、天气客户端实现的要点
首先,需要说明的是,这份代码是在windows系统下使用gcc6.3.0进行编译的。
1、秘钥
心知天气:http://www.seniverse.com
我们完成这个实验必须得到这个天气网站(或者其它天气网站)上面去注册一个账号才能使用它的天气数据,注册之后每个账户都会有一个私钥,例如:
私钥 SMEieQjde1C9eXnbE
这个是我们程序中需要用到。
2、IP和端口
上一节分享了socket的笔记,我们与服务端通信,需要知道三个重要的信息,分别是:

  1. IP地址

端口

  1. 传输方式

我这里的心知天气的IP是116.62.81.138,端口是80,传输方式是TCP,对应的代码如下:

3c78c07ac5cd5375a863f39537a24464.png


这里的WEATHER_IP_ADDR对应的就是116.62.81.138,WEATHER_PORT对应的就是80。
3、GET请求
HTTP有几种请求方法,我们这里使用的是GET请求。查看心知天气API文档可知,请求地址示例为:https://api.seniverse.com/v3/weather/now.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c
这是一个天气实况的请求地址示例,其有几个重要的参数:

9850577e132110def72e9959bb559add.png


这里的key是个很重要的参数,就是我们前面说的私钥。
我们的天气客户端就是要往天气服务端发送类似这样的GET请求来获取天气数据,具体的请求方法示例为:
对应代码如下:

6968042e0a89dcf4fed51eb929c44ca3.png


这里简单复习一下sprintf函数的用法:
(1)函数功能:字符串格式化
(2)函数原型:int sprintf(char *string, char *format [,argument,...]);string: 这是指向一个字符数组的指针,该数组存储了 C 字符串。format : 这是字符串,包含了要被写入到字符串 str 的文本。[argument]...:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。
(3)使用示例:
假如此时str为"hello",num为5201314,则此时buf中的内容为:hello,5201314,需要注意的是buf的容量要足够大。
4、天气服务端返回的数据
天气服务端给我们天气客户端返回的数据为JSON格式数据,可查阅往期笔记JSON的简单认识。我们这个天气客户端只是实现了查询此刻天气(对应的数据包为now.json)及近三天天气情况(对应的数据包为daily.json),如要查询其他信息,可模仿我们这里处理now.json和daily.json的方法,我们用cJson库进行解析。
只要把cJSON.c与cJSON.h放到工程主程序所在目录,然后在主程序中包含头文件JSON.h即可引入该库。如:

e3546ad859daae0226d730dc62ce2562.png


为了解析now.json和daily.json中的有用数据,我们建立如下结构体:

7ac021ae8158b28d902a2d0433d6bc3b.png


现在看一下now.json和daily.json的内容是怎样的:
(1)now.json示例及解析:now.json:

dead3cccaad6415c3290b2403c3a5a0a.png


这里实测了一下,我们普通用户(因为没充钱,哈哈~)申请的now.json数据中,now对象中只有如下三个键值对:

566a715b43c49a628c7b7f232645975a.png

now.json的解析函数:
(2)daily.json示例及解析:daily.json:

6d80f26a64e5259fc210af99fac1c228.png

daily.json解析函数:
5、获取天气数据并解析
这个函数就涉及到我们上一节笔记中的socket编程的知识了,先看一下这个函数实现的总体框图:

9698efeb6b91861ef5d112f18c1bdc04.png


下面是函数实现的细节过程:
6、编译
如何编译这份代码(可在文末进行获取)呢?
这份C代码工程的文件如下:

155b12f474bce8b9e247743364ea1a71.png


在windows系统下使用gcc编译器编译,编译命令为:
如:

2c552e26cae3fd4ccf02d5a9911e108a.png


这里的weather_client.exe就是我们编译生成的可执行文件:天气客户端,双击就可以运行了。此外,-lwsock32参数上一节也有讲过,这个参数用于链接windows下socket编程必须的winsock2这个库。若是使用集成开发环境,则需要把wsock32.lib放在工程目录下,并在我们代码中#include 下面加上一行 #pragma comment(lib, "ws2_32.lib")代码(在IDE里编译本人未验证,有兴趣的朋友可尝试)。
需要说明的是,Windows下默认是没有装gcc的,需要自己进行配置,关于mingw的配置及使用之后再做分享。
7、运行结果示例

20945f5a6de295d1c1cce5ca06536886.png


此处,只能使用拼音进行搜索,其实也可以做输入汉字进行搜索的功能,只是要进行转码处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值