Python网络通信

news2024/11/25 18:47:20

目录

基本的网络知识

TCP/IP

IP地址

端口

HTTP/HTTPS

HTTP

HTTPS

搭建自己的Web服务器

urllib.request模块

发送GET请求

发送POST请求

JSON数据

JSON文档的结构

JSON数据的解码

下载图片示例

返回所有备忘录信息

此文章讲解如何通过Python访问互联网上的资源,这也是网络爬虫技术的基础。

基本的网络知识

TCP/IP

在网络通信中会用到一些相关协议,其中,TCP/IP是非常重要的协议,由IP和TCP两个协议构成。IP(Internet Protocol)是一种低级的路由协议,它将数据拆分在许多小的数据包中,并通过网络将它们发送到某一特定地址,但无法保证所有包都抵达目的地,也不能保证包按顺序抵达。

由于通过IP传输数据存在不安全性,所以还需要通过TCP(Transmi ssion Control Protocol,传输控制协议)进行网络通信。TCP是一种高层次的协议,是面向连接的可靠数据传输协议,如果有些数据包没被收到,则会重发,对数据包的内容准确性进行检查并保证数据包按顺序抵达 。所以,TCP能够保证数据包安全地按照发送时的顺序送达目的地。

IP地址

为了实现网络中不同计算机之间的通信,每台计算机都必须有一个与众不同的标识,这就是IP地址,TCP/IP使用IP地址来标识源地址和目的地址。

最初,所有的IP地址都是由32位数字构成的,由4个8位的二进制数组成,每8位之间用圆点隔开,例如192.168.1.1,这种类型的地址通过IPv4指定。现在有一种新的地址模式,叫作IPv6,IPv6使用128位数字表示一个地址。尽管IPv6比IPv4有很多优势,但是由于习惯的问题,很多设备还是采用IPv4。

另外,我们有时还会用到一个特殊的IP地址127.0.0.1,127.0.0.1叫作回送地址,指本机。回送地址主要用于网络软件测试及本机的进程间通信,只发送数据,只进行本机进程间通信,不进行任何网络传输。

端口

一个IP地址标识一台计算机,每一台计算机又有很多网络通信程序在运行,提供网络服务或进行通信,这就需要不同的端口进行通信。如果把IP地址比作电话号码,那么端口就是分机号码,在进行网络通信时不仅要指定IP地址,还要指定端口号。

TCP/IP系统中的端口号是一个16位的数字,它的范围是0~65535 。将小于1024的端口号保留给预定义的服务,例如HTTP是80,FTP是21,Telnet是23,Email是25,等等。除非要和那些服务进行通信,否则不应该使用小于1024的端口。

HTTP/HTTPS

对互联网的访问大多基于HTTP/HTTPS,HTTP/HTTPS是TCP/IP的一种协议。

HTTP

HTTP(Hypertext Transfer Protocol,超文本传输协议)属于应用层协议,其简捷、快速的方式适用于分布式超文本信息传输。HTTP是无连接协议,即在每一次请求时都建立连接,服务器在处理完客户端的请求后,会先应答客户端,然后断开连接,不会一直占用网络资源。

HTTP/1.1共定义了8种请求方法:OPTIONS、HEAD、GET、POST 、PUT、DELETE、TRACE和CONNECT。GET和POST方法最常用。

(1)GET方法:用于向指定的资源发出请求,被发送的信息“显式” 地跟在URL后面。它一般只用于读取数据,例如静态图片等。GET方法有点像使用明信片给别人写信,将“信的内容”写在外面,接触到的人都可以看到,因此是不安全的。

(2)POST方法:用于向指定的资源提交数据,请求服务器进行处理 ,例如提交表单或者上传文件等。数据被包含在请求体中。POST方法像是把“信的内容”装入信封中,接触到该信封的人都看不到信的内容, 因此是相对安全的。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议 )是超文本传输协议和SSL的组合,用于提供加密通信及对网络服务器身份的鉴定。简单地说,HTTPS是加密的HTTP。

HTTPS与HTTP的区别是:HTTPS使用https://代替http://,HTTPS使用端口443,而HTTP使用端口80与TCP/IP通信。

搭建自己的Web服务器

搭建Web服务器的步骤如下。

(1)安装JDK(Java开发工具包)

我们的Web服务器是Apache Tomcat,是支持Java Web技术的Web服务器。Apache Tomcat的运行需要Java运行环境,而JDK提供了Java运行环境,因此我们首先需要安装JDK。

(2)配置Java运行环境

Apache Tomcat在运行时需要用到JAVA_HOME环境变量,因此需要先设置JAVA_HOME环境变量。

首先,打开Windows系统环境变量设置对话框,打开该对话框有很多方式,如果是Windows 10系统,则在桌面上用鼠标右键单击“此电脑”图标,弹出Windows系统对话框,之后如下图所示操作。

(3)安装Apache Tomcat服务器

官网下载Apache Tomcat安装包apache-tom cat-9.0.13.zip并解压即可安装Apache Tom cat服务器。

(4)启动Apache Tomcat服务器

在Apache Tomcat解压目录的bin目录下找到startup.bat文件,双击sta rtup.bat即可启动Apache Tomcat。

启动Apache Tomcat成功后会看到如下信息。

 (5)测试Apache Tomcat服务器

打开浏览器,在地址栏中输入http://localhost:8080/NoteWebService/,在打开的页面上介绍了当前Web服务器已经安装的Web应用(Note WebService)的具体使用方法。

打开浏览器,在地址栏中输入网址http://localhost:8080/NoteWeb Service/note.do,在打开的页面上可以查询所有数据。

注意:NoteWebService可以查询、插入、删除和修改note(备忘录)信息,备忘录信息有4个字段:CDate(日期)、Content(内容)、UserlD(用户ID)和ID(备忘录ID)

urllib.request模块

我们要想在Python中访问互联网资源,则可以使用官方内置的urllib .request模块。

发送GET请求

如果要发送HTTP/HTTPS的GET请求,则可以使用urllib.request模块的Request对象。

示例代码如下:

import urllib.request
url='http://localhost:8080/NoteWebService/note.do?action=query&ID=10' # 请求URL网址,URL中?后的内容是请求参数,多个参数之间以&分隔,action=query是一对参数,action是参数名,query是参数值
req=urllib.request.Request(url) # 创建Request对象,默认是GET请求
with urllib.request.urlopen(req) as response: # 发送网络请求,response是需要释放的对象,可以使用with as代码块管理和释放
    data=response.read() # 读取数据,为字节序列数据
    json_data=data.decode() # 将字节序列数据转换为字符串
    print(json_data)

发送POST请求

如果要发送HTTP/HTTPS的POST请求,则其发送流程与发送GET请求非常类似。

示例代码如下:

import urllib.request
url='http://localhost:8080/NoteWebService/note.do'
# 准备HTTP参数
params_dict={'action':'query','ID':'10'} # 准备将参数放到字典中
params_str=urllib.parse.urlencode(params_dict) # 将字符参数有转换为字符串,形式为action=query&ID=10
print(params_str)
# 字符串转换为字节序列对象
params_bytes=params_str.encode() # 发送POST请求时的参数要以字节序列形式发送
req=urllib.request.Request(url,data=params_bytes) # 发送POST请求
with urllib.request.urlopen(req) as response: # 发送网络请求,response是需要释放的对象,可以使用with as代码块管理和释放
    data=response.read() # 读取数据,为字节序列数据
    json_data=data.decode() # 将字节序列数据转换为字符串
    print(json_data)

JSON数据

JSON文档的结构

构成JSON文档的两种结构为:JSON对象(object)和JSON数组(array)。

在JSON对象和JSON数组中都有JSON数值,JSON数值有字符串、数字、true、false、null、对象或数组。true和false是布尔值,null表示空的对象,而且对象和数组可以嵌套。

(1)JSON对象

JSON对象类似于Python中的字典类型,示例如下:

{ # 使用大括号括起来
    "name":"a.htm", # 名称,需要使用双括号括起来,JSON数值,“名称-值”对
    "size":345,
    "saved":true
}

(2)JSON数组

JSON数组类似于Python中的列表类型,示例如下:

[ # 使用中括号括起来
    "text","html","css" # JSON数值
]

JSON数据的解码

JSON数据的解码(decode)指将JSON数据转换为Python数据,当从网络中接收或从磁盘中读取JSON数据时,需要将其解码为Python数据。

在编码过程中,JSON数据被转换为Python数据。

我们使用json模块提供的loads(str)函数进行JSON数据的解码,参数str是JSON字符串,返回Python数据。

重构前面的示例,代码如下:

import urllib.request
import json
url='http://localhost:8080/NoteWebService/note.do?action=query&ID=10' # 网络资源地址
req=urllib.request.Request(url)
with urllib.request.Request(req) as response:
    data=response.read()
    json_data=data.decode()
    print('JSON字符串:',json_data)
    py_dict=json.loads(json_data) # 解码JSON字符串,返回字典
    print('备忘录ID:',py_dict['ID'])
    print('备忘录日期:',py_dict['CDate'])
    print('备忘录内容:',py_dict['Content'])
    print('用户ID:',py_dict['UserID'])

下载图片示例

从服务器返回的数据除了字符串也能返回其他类型的数据,下面给一个下载图片示例。

import urllib.request
url='http://localhost:8080/NoteWebService/logo.png' # 网络资源地址
req=urllib.request.Request(url)
with urllib.request.Request(url) as response:
    data=response.read()
    f_name='download.png' # 下载后的文件名
    with open(f_name,'wb') as f: # 以写入方式打开二进制文件
        f.write(data)
        print('下载文件成功')

在文件下载成功后,会在当前目录下看到download.png文件。

返回所有备忘录信息

参考代码如下:

import urllib.request
import json
url='http://localhost:8080/NoteWebService/note.do' # 网络资源地址
req=urllib.request.Request(url)
with urllib.request.Request(req) as response:
    data=response.read()
    json_data=data.decode()
    
    py_dict=json.loads(json_data)
    # 返回所有的备忘录记录信息
    record_array=py_dict['Record'] # record_array是JSON数组
    
    for record_obj in record_array: # 遍历所有备忘录信息
        print('--------备忘录记录--------')
        print('备忘录ID:',record_obj['ID'])
        print('备忘录日期:',record_obj['CDate'])
        print('备忘录内容:',record_obj['Content'])
        print('用户ID:',record_obj['UserID'])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1444569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业互联网IoT物联网设备网络接入认证安全最佳实践

制造业数字化转型过程中,产线物联网(IoT)设备、工控机的引入极大提高了生产效率的同时,也埋下了不容忽视的安全隐患。尤其制造业已成为勒索软件攻击的重灾区,利用物联网设备漏洞进行恶意攻击的事件不胜枚举&#xff0c…

【小沐学GIS】基于Android绘制三维数字地球Earth(OpenGL)

🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第二期3【小沐学GIS】…

Vue3中Setup概述和使用(三)

一、引入Setup 1、Person.Vue 与Vue3编写简单的App组件(二) 中的区别是&#xff1a;取消data、methods等方法,而是将数据和方法定义全部放进setup中。 <template><div class"person"><h1>姓名:{{name}}</h1><h1>年龄:{{age}}</h…

天猫数据分析(天猫数据查询分析工具/软件):2023年天猫户外用品市场蓬勃发展,国产品牌具备竞争优势

后疫情时代&#xff0c;大众对于户外活动的热情高涨&#xff0c;参与度迅速提升&#xff0c;在这一消费热情下&#xff0c;我国的户外用品行业呈现出蓬勃的发展态势&#xff0c;市场规模不断扩大。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;2023年度&#xff0c;…

HarmonyOS 状态管理装饰器 Observed与ObjectLink 处理嵌套对象/对象数组 结构双向绑定

本文 我们还是来说 两个 harmonyos 状态管理的装饰器 Observed与ObjectLink 他们是用于 嵌套对象 或者 以对象类型为数组元素 的数据结构 做双向同步的 之前 我们说过的 state和link 都无法捕捉到 这两种数据内部结构的变化 这里 我们模拟一个类数据结构 class Person{name:…

Python 3 中使用 pandas 和 Jupyter Notebook 进行数据分析和可视化

简介 Python 的 pandas 包用于数据操作和分析&#xff0c;旨在让您以直观的方式处理带标签或关联数据。 pandas 包提供了电子表格功能&#xff0c;但由于您正在使用 Python&#xff0c;因此它比传统的图形电子表格程序要快得多且更高效。 在本教程中&#xff0c;我们将介绍如…

Python运算符大全,值得收藏

一、 Python的算术运算 Python的算术运算符与C语言类似&#xff0c;略有不同。包括加()、减(-)、乘(*)、除(/)、取余(%)、按位或(|)、按位与(&)、按位求补(~)、左移位(<<)、右移位(>>)、单目求反(-)、幂运算(**)、整除运算(//)、增强运算、增强矩阵乘法()。 …

【开源】SpringBoot框架开发个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

数据结构第十五天(树的存储/孩子表示法)

目录 前言 概述 接口 源码 测试函数 运行结果 往期精彩内容 前言 最近在知乎上看到的一个问题&#xff0c; 也许&#xff0c;短暂的离别&#xff0c;只为更好的相遇&#xff01; 2024&#xff0c;友友们&#xff0c;龙年快乐&#xff0c;新的一年&#xff0c;祝愿码上…

力扣面试题 17.04. 消失的数字(求和,位运算)

Problem: 面试题 17.04. 消失的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:求和 先求取1-n的数字和,再减去数组中所有元素的和即为缺失数 思路2:位运算 我们利用异或运算的特性:相同位为0,不同位为1;0与仍何数异或后得到仍何数,即我们先另一个变量(初始为0)与…

蓝牙 - BTSnoop File Format

1, Overview [ 概览 ] BTSnoop 文件格式适用于存储 Bluetooth HCI 通讯数据。它与 RFC 1761 中记录的 snoop 格式非常相似。 The BTSnoop file format is suitable for storing Bluetooth HCI traffic. It closely resembles the snoop format, as documented in RFC 1761. 2, …

Linux(Ubuntu) 环境搭建:Nginx

注&#xff1a;服务器默认以root用户登录 NGINX 官方网站地址&#xff1a;https://nginx.org/en/NGINX 官方安装文档地址&#xff1a;https://nginx.org/en/docs/install.html服务器的终端中输入以下指令&#xff1a; # 安装 Nginx apt-get install nginx # 查看版本信息 ngi…

【算法】排序详解(快速排序,堆排序,归并排序,插入排序,希尔排序,选择排序,冒泡排序)

目录 排序的概念&#xff1a; 排序算法的实现&#xff1a; 插入排序&#xff1a; 希尔排序&#xff1a; 选择排序&#xff1a; 堆排序&#xff1a; 冒泡排序&#xff1a; 快速排序&#xff1a; 快速排序的基本框架&#xff1a; 1.Hoare法 2. 挖坑法 3.前后指针法 快…

【数学建模】【2024年】【第40届】【MCM/ICM】【B题 搜寻潜水器】【解题思路】

一、题目 &#xff08;一&#xff09;赛题原文 2024 MCM Problem A: Resource Availability and Sex Ratios Maritime Cruises Mini-Submarines (MCMS), a company based in Greece, builds submersibles capable of carrying humans to the deepest parts of the ocean. A …

基于POSCMS架构开发的素材资源网平台整站全面修复版源码

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买) 资源简介 基于POSCMS架构开发的素材资源网平台整站全面修复版源码一键安装版 系统功能介绍 支持文章、论坛、下载、…

解决 postman测试接口报404 Not Found

JDK版本&#xff1a;jdk17 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 文章目录 问题描述原因分析解决方案 问题描述 当我使用postman测试接口时&#xff0c;报了 404 Not Found 的错误&#xff0c;报错截图如下所示 但我的后端程序中已经定义了该接口&#xff0c;如下所示 …

2024给你一些Android 应用性能优化的建议

2024给你一些Android 应用性能优化的建议 在当今激烈竞争的移动应用市场中&#xff0c;用户对应用性能和体验的要求越来越高。因此&#xff0c;进行 Android 应用性能优化是开发过程中必不可少的一环。下面将详细介绍如何提升应用的性能&#xff0c;以提升用户体验。 1. 优化…

静态时序分析:建立时间分析

静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中&#xff0c;建立时间检查约束了触发器时钟引脚&#xff08;时钟路径&#xff09;和输入数据引脚&#xff08;数据路径&#xff09;之间的时序关系&#x…

EMC学习笔记(二十四)降低EMI的PCB设计指南(四)

降低EMI的PCB设计指南&#xff08;四&#xff09; 1.电路板分区2.信号走线2.1 电容和电感串扰2.2 天线2.3 端接和传输线2.4输入端的阻抗匹配 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.电路板分区 电路板分区与电路板平面规划具有相同的基本含义&#x…

ubuntu22.04 安装部署04:经常死机,鼠标,键盘无响应

相关文章&#xff1a; ubuntu22.04 安装部署01&#xff1a;禁用内核更新 ubuntu22.04安装部署02&#xff1a;禁用显卡更新 ubuntu22.04安装部署03&#xff1a; 设置root密码 一、现象说明 1. 开机一小时后&#xff0c;突然之间网络掉线&#xff0c;鼠标、键盘无反应。 2.…