欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

http 协议消息发送及接收 (查询天气为例)python实现

程序员文章站 2022-05-21 11:56:32
要求:基于流(stream)套接字(socket)编写一个客户端(client)程序;程序可连接(connect)某服务器网站(比如:t.weather.sojson.com);程序向服务器网站发送 http 请求(GET 方法, /api/weather/city/101040100),服务器网站返回 http 响应(JSON 格式);程序解析并展示服务器网站的响应消息(JSON 格式)。代码实现:#coding=utf-8import socketimport js...

要求:

  1. 基于流(stream)套接字(socket)编写一个客户端(client)程序;

  2. 程序可连接(connect)某服务器网站(比如:t.weather.sojson.com);

  3. 程序向服务器网站发送 http 请求(GET 方法, /api/weather/city/101040100),服务器网站返回 http 响应(JSON 格式);

  4. 程序解析并展示服务器网站的响应消息(JSON 格式)。

代码实现:

#coding=utf-8

import socket
import json
from urllib.parse import quote_plus

# 一个HTTP请求报文由请求行、请求头部、空行、请求数据4部分组成
# 请求行由请求方法字段(GET\POST...)、url字段和HTTP协议版本3个字段组成,以\n分离
request_text = """\
GET /api/weather/city/101040100?address={}&sensor=false HTTP/1.1\r\n\
Host: t.weather.sojson.com:80\r\n\
User-Agent: CQUPT\r\n\
Connection: close\r\n\
\r\n\
"""
def get_weather(address):       #获取天气预报的json格式数据段
    sock = socket.socket()      # 创建socket实例
    sock.connect(('t.weather.sojson.com', 80))      # 客户端建立连接
    request = request_text.format(quote_plus(address))
    sock.sendall(request.encode('ascii'))       # 客户端发送消息,encode函数使得HTTP的报文以ASCII码的形势发给服务器
    data = b''
    while True:
        more = sock.recv(4096)      # 返回当前任意长度的可读数据,期望长度4096
        if not more:
            break
        data += more
    sock.close()
    temp = data.decode('utf-8')  # 解码
    begin = temp.index('{')     #找到第一个‘{’开始的位置
    end =len(temp) - temp[::-1].index('}') + 1      #找到最后一个‘}’的结束位置,截取json格式的数据段
    print('*************************')      #输出一条线判断这个函数是否运行成功
    return json.loads(temp[begin:end])

def show_weather(weather_data):     #展示天气预报
    weather_dict = weather_data     #先把json转成字典
    forecast = weather_dict.get('data').get('forecast')     #把后面十五天天气预报存到列表里面
    print('城市:', weather_dict.get('cityInfo').get('city'))      #用字典的方法输出
    print('时间:', weather_dict.get('time'))
    print('当前温度:', weather_dict.get('data').get('wendu') + '℃ ')
    print('当前湿度:', weather_dict.get('data').get('shidu'))
    print('空气质量:', weather_dict.get('data').get('quality'))
    print('pm2.5:', weather_dict.get('data').get('pm25'))
    print('************************************')
    fifteen_day_forecast = input('是否要显示未来十五天天气,是/否:')
    if fifteen_day_forecast == '是' or 'YES' or 'yes':
        for i in range(15):
            print('日期:', forecast[i].get('ymd'),forecast[i].get('week'))
            print('天气:', forecast[i].get('type'))
            print('温度:', forecast[i].get('high'),forecast[i].get('low'))
            print('日出:', forecast[i].get('sunrise'))
            print('日落:', forecast[i].get('sunset'))
            print('风向:', forecast[i].get('fx'))
            print('风力:', forecast[i].get('fl'))
            print('温馨提示:',forecast[i].get('notice'))
            print('--------------------------')

weather_data = get_weather('重庆')
show_weather(weather_data)

运行结果如下:
http 协议消息发送及接收  (查询天气为例)python实现
后面还有就没有截图了

本文地址:https://blog.csdn.net/bianxia123456/article/details/107160237