【python】进阶--->网络编程(二)

news2025/2/3 18:55:31

一、分层模型

OSI/RM(开放系统互联参考模型)

是由国际标准化组织提出来的一种网络互联模型,成为所有的销售商都能实现的开放网络模型.(OSI模型提供我们理解网络协议的内部运作)
OSI模型将网络通信工作分为7层,每一层为上一层服务,并为上一层提供一个访问的接口或者界面.
越下面的层,越靠近硬件;
越上面的层,越靠近用户.
7应用层
为操作系统或网络应用程序提供网络服务的接口.
6表示层
对上层数据或信息进行变化保证主机应用层的信息可以被另一个主机的应用程序理解.数据的加密,压缩,格式转换等等.
5会话层
管理主机之间的会话进程,建立管理终止进程之间的会话.
4传输层
负责对上层数据分段,并提供端对端,可靠和不可靠的传输.
数据单位 : 数据段
典型设备 : 网关
3网络层
负责对子网间的数据包进行路由选择.
数据单位 : 数据包
设备 : 路由器
2数据链路层
在不可靠的物理媒介上进行可靠的传输.
作用 : 物理地址寻址,数据成帧,流量控制,数据检错,重发等等
数据单位 :
典型设备 : 交换机,网卡
1物理层
为上层协议提供了一个传输数据的物理媒体
数据单位 : bit
设备 : 光纤,双绞线,同轴电缆,集线器

TCP/IP模型

4应用层 : FTP,HTTP,TFTP,NFS
3传输层 : TCP,UDP
2网络层 : IP,ICMP,IGMP
1网络接口层 : ARP,RARP

ARP : 正向地址解析协议,通过已知的ip地址找到对应主机的MAC地址.
RARP : 反向地址转换协议.通过MAC地址确定ip地址.
ICMP : 互联网控制报文协议,用于在ip主机和路由器之间传递控制消息
IGMP : 是互联网组管理协议.
TCP : 传输控制协议
UDP : 用户数据报协议

在这里插入图片描述
TCP客户端

# tcp客户端
import socket
# 1.socket创建套接字
tcp = socket.socket()  # 默认是tcp套接字
# 2.建立连接connect()
tcp.connect(('172.168.1.3', 8080))
# 3.send()发送数据
sendData = input('请输入要发送的数据:')
tcp.send(sendData.encode('gbk'))
# 4.recv()接收数据
recvData = tcp.recv(1024)
print('接收:', recvData.decode('gbk'))
# 5,关闭套接字close()
tcp.close()

TCP服务器

# tcp服务器
import socket
# 1.创建套接字
tcp = socket.socket()
# 2.绑定IP地址端口号
tcp.bind(('', 8080))
# 3.监听listen()
# 使用socket套接字创建的默认属性是主动,使用listen会被动
# 这样就可以接收别人来连接
tcp.listen(5)  # 括号内表示一次可以同时接收的数量
# 4.连接accept()
# 如果有新的客户端来连接服务器,那么会产生一个新的套接字
# 专门为这个客户端服务
# clientSocket:用来为这个客户端服务的套接字
# clientAddr:客户端的IP地址和端口号
clientSocket, clientAddr = tcp.accept()
# 5.接收对方发送过来的数据
recvData = clientSocket.recv(1024)
print('客户端:', recvData.decode('gbk'))
# 6.发送一些数据给客户端
sendData = input('请输入要回复的:')
clientSocket.send(sendData.encode('gbk'))
# 7.关闭专门为这个客户端服务的套接字
clientSocket.close()

TCP案例_文件下载

import socket
 
tcp = socket.socket()
# 连接服务器
ip = input('请输入ip地址:')
port = int(input('请输入端口号:'))
tcp.connect((ip, port))
 
# 发送下载文件的请求
fileName = input('请输入要下载的文件名字:')
tcp.send(fileName.encode('gbk'))
 
# 接收文件的数据并且保存到文件中
recvData = tcp.recv(100000)
if recvData:
    with open('[新]'+fileName, 'wb') as f:
        f.write(recvData)
    print('下载成功')
else:
    print('下载失败')
 
# 关闭套接字
tcp.close()

二、网络中进程如何通信

tcp/ip中的网络层IP地址可以表示网络中的 主机,传输层”协议+端口号”可以标识主机中的进程.
利用ip地址+协议+端口号就可以标识网络中的进程.
使用tcp/ip协议的应用程序通常采用应用编程接口 : UNIX DSD的套接字(socket)
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.建立网络通信至少要一对socket.
http提供了封装或者显示数据的具体格式;
socket就提供了网络通信的能力.

socket的创建

import socket
s = socket.socket(AddressFamily, type)
AddressFamily:可以选择AF_INET(用于网络进程通信)或者AF_UNIX(用于同一台计算机进程间通信).默认值为AF_INET
type:套接字类型,可以SOCK_STREAM(TCP协议)或者SOCK_DGRAM(UDP协议).默认值是SOCK_STREAM.
套接字使用流程和文件的使用类似:
1.创建套接字:s = socket.socket(AddressFamily, type)
2.使用套接字收/发数据
3.关闭套接字:s.close()

文件下载服务器

import socket
 
def getFileContent(fileName):
    try:
        with open(fileName, 'rb') as f:
            fileContent = f.read()
        return fileContent
    except:
        print('下载的文件不存在')
 
 
def main():
    tcp = socket.socket()
    tcp.bind(('', 8080))
    tcp.listen(5)
    # 等待客户端到来
    while True:
        clientSocket, clientAddr = tcp.accept()
        print('新的客户来了:', str(clientAddr))
        fileName = clientSocket.recv(1024).decode('gbk')
        print('需要下载的文件是:', fileName)
        # 获取文件数据
        fileContent = getFileContent(fileName)
        if fileContent:
            # 发送文件数据给客户端
            clientSocket.send(fileContent)
            print('发送成功')
        else:
            print('发送失败')
        # 关闭为这个客户端服务的套接字
        clientSocket.close()
 
 
if __name__ == '__main__':
    main()

udp : 用户数据报协议 udp提供不可靠的传输,只是把应用程序传给ip层的数据报发送出去,不能保证能够到达目的地.
udp在传输数据前不用在客户端和服务器之间建立一个连接,且没有超时重传机制,所以速度非常快.
udp是面向消息的协议,通信时不需要建立连接,数据传输自然不可靠,一般用于多点通信和实时的数据业务:语音广播,视频,qq,简单文件传送等等.

在这里插入图片描述
在这里插入图片描述

UDP客户端

# udp客户端
# socket是python内置的
import socket
 
# 1.socket()创建udp套接字
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.通过sendto(要发送的数据, 发送的地址)发送数据
sendAddr = ('172.168.1.3', 8080)
sendData = input('输入要发送的数据:')
udp.sendto(sendData.encode('gbk'), sendAddr)
# 阻塞等到对方发送数据才能接收到
# 3.recvfrom()接收数据,括号内表示最大接收数据
recvData = udp.recvfrom(1024)
print('recv:', recvData)
# recvfrom返回值包含两部分内容:对方发送的数据,对方的地址
# 4.关闭套接字close()
udp.close()

UDP服务器

import socket
# udp服务端
# 1.创建套接字
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.bind()绑定本机的ip地址和端口号
udp.bind(('172.168.1.3', 8080))
# 3.recvfrom()接收数据
recvData, recvAddr = udp.recvfrom(1024)
print(recvData.decode('gbk'))
# 4.sendto()发送数据
sendData = input('输入发送的数据:')
udp.sendto(sendData.encode('gbk'), recvAddr)
# 5.关闭套接字close()
udp.close()

UDP实战案例

import socket
 
 
def send(udp):
    # 1.输入对方的ip地址和端口号
    ip = input('请输入对方的ip地址:')
    port = int(input('请输入对方的端口号:'))
    # 2.输入要发送的数据
    sendData = input('请输入要发送的数据:')
    # 3.发送数据
    udp.sendto(sendData.encode('utf-8'), (ip, port))
 
 
def recv(udp):
    # 1.接收数据
    recvData, recvAddr = udp.recvfrom(1024)
    # 2.显示数据
    print(recvAddr, ">>>>>>>", recvData.decode('utf-8'))
 
 
if __name__ == '__main__':
    # 1.创建套接字
    udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2.绑定端口号
    # '':k可以直接获取当前计算机的ip地址
    udp.bind(('', 8080))
    # 3.根据用户的选择来调用发送/接收数据
    while True:
        print('1.发送数据')
        print('2.接收数据')
        num = input('请输入选择功能:')
        if num == '1':
            send(udp)
        elif num == '2':
            recv(udp)
        else:
            udp.close()

三、tcp协议(传输控制协议)

tcp是一种面向连接的,可靠的,基于字节流的传输层通信协议.
特点 :

1.采用发送应答机制 : tcp发送的每个报文段都必须等到接收方的应答才认为这个报文段传输成功
2.超时重传:
发送端发出一个报文段之后就启动一个定时器,如果在定时时间内没有收到应答就重新发送这个报文段.
为了保证不丢包,会给每个数据包一个序号,同时序号也保证了传送到接收端的包是按照顺序接收的.然后接收端接收到之后会对对应的包发回一个确认.如果发送端没有收到确认,那么会认为数据包丢失,将会重新传送.
3.错误校验
4.流量控制和阻塞管理

在这里插入图片描述

在这里插入图片描述

关于Python网络编程(一)的介绍今天就到这里啦,后续我会为大家介绍mysql数据库的相关知识哦~
关注我,带你领略Python的风采~😍😍😍

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

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

相关文章

【数字图像处理】实验一 图像基本运算

图像基本运算 一、实验内容: 1. 熟悉和掌握利用Matlab工具进行数字图像的读、写、显示等数字图像处理基本步骤。 2. 熟练掌握各种图像点运算的基本原理及方法。 3. 能够从深刻理解点运算,并能够思考拓展到一定的应用领…

【爬虫软件】孔夫子二手书采集

项目演示 孔网爬取图书信息 目录结构 [ |-- api-ms-win-core-synch-l1-2-0.dll, |-- api-ms-win-core-sysinfo-l1-1-0.dll, |-- api-ms-win-core-timezone-l1-1-0.dll, |-- api-ms-win-core-util-l1-1-0.dll, |-- api-ms-win-crt-conio-l1-1-0.dll, |-- api…

【matlab】绘制横状双组渐变柱状图

【matlab】绘制横状双组渐变柱状图

Frida07 - dexdump核心源码分析

项目地址 https://github.com/hluwa/frida-dexdump 代码解析 项目中的核心函数是 searchDex: function searchDex(deepSearch) {var result [];Process.enumerateRanges(r--).forEach(function (range) {try {....} catch (e) {}});return result; }里面用了一…

OpenCV-Python(19):Canny边缘检测

目录 学习目标 Canny 边缘检测原理 1.噪声抑制(噪声去除) 2.梯度计算 3.非极大值抑制 4.双阈值检测(滞后阈值) 5.边缘连接 Canny 边缘检测步骤 Canny 边缘检测的OpenCV实现 不同阈值的边缘检测效果 学习目标 了解Canny边缘检测的概念学习掌握函数cv2.Canny()的用法 …

Django(二)

1.django框架 1.1 安装 pip install django3.21.2 命令行 创建项目 cd 指定目录 django-admin startproject 项目名mysite ├── manage.py [项目的管理工具] └── mysite├── __init__.py├── settings.py 【配置文件,只有一部分…

电子科大软件测试~第三次作业

第三次作业 第一题 采用JUnit软件测试框架进行测试程序编程,实现对下面java程序进行单元测试,找出其中缺陷。然后修改缺陷,直到通过单元测试,给出测试程序脚本和运行结果界面。 public class getMax {public int get_max(int x…

Redis实现日榜|直播间榜单|排行榜|Redis实现日榜01

前言 直播间贡献榜是一种常见的直播平台功能,用于展示观众在直播过程中的贡献情况。它可以根据观众的互动行为和贡献值进行排名,并实时更新,以鼓励观众积极参与直播活动。 在直播间贡献榜中,每个观众都有一个对应的贡献值&#…

这样使用云渲染又快又省钱

我们都知道使用云渲染是要钱的,而且渲染的时间越久,需要的渲染费越多,哪么如何又快又省钱的拿到效果图呢?用炫云的渲染质量,保准让你使用云渲染渲染效果图又快又省钱。 我们使用炫云的时候,根据自己的需求…

输入框获取焦点

Entry Component struct Test {build() {Row() {Column({ space: 5 }) {//Text("自定义样式").customStyles(20,Color.Yellow).backgroundColor("#36D").padding(10).borderRadius(30)TextInput({placeholder: "获取焦点"}).borderColor(Color.Y…

LLM微调(四)| 微调Llama 2实现Text-to-SQL,并使用LlamaIndex在数据库上进行推理

Llama 2是开源LLM发展的一个巨大里程碑。最大模型及其经过微调的变体位居Hugging Face Open LLM排行榜(https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)前列。多个基准测试表明,就性能而言,它正在接近GPT-3.5…

图灵日记之java奇妙历险记--数据类型与变量运算符

目录 数据类型与变量字面常量数据类型变量语法格式整型变量浮点型变量字符型变量希尔型变量类型转换自动类型转换(隐式)强制类型转换(显式) 类型提升不同数据类型的运算小于4字节数据类型的运算 字符串类型 运算符算术运算符关系运算符逻辑运算符逻辑与&&逻辑或||逻辑非…

案例125:基于微信小程序的个人健康数据管理系统的设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

【论文阅读】FreeU: Free Lunch in Diffusion U-Net

FreeU: 无需训练直接提升扩散模型生成效果。 paper:https://arxiv.org/abs/2309.11497 code:GitHub - ChenyangSi/FreeU: FreeU: Free Lunch in Diffusion U-Net 1. 介绍 贡献: •研究并揭示了U-Net架构在扩散模型中去噪的潜力&#xff0…

目标检测入门体验,技术选型,加载数据集、构建机器学习模型、训练并评估

Hi, I’m Shendi 1、目标检测入门体验,技术选型,加载数据集、构建机器学习模型、训练并评估 在最近有了个物体识别的需求,于是开始学习 在一番比较与询问后,最终选择 TensorFlow。 对于编程语言,我比较偏向Java或nod…

vue关闭当前路由页面并跳转到其父页面

1.dom中添加关闭或取消按钮 <el-button type"primary" class"blueLinearbg cancelBtn" click"cancel" >取 消</el-button>2.cancel方法中 /*取消或关闭*/cancel(){this.$store.dispatch("tagsView/delView", this.$route)…

state的保留与重置

让组件状态保留的情况&#xff1a; 让组件状态重置的3种情况&#xff1a;

[NISACTF 2022]easyssrf

[NISACTF 2022]easyssrf wp ssrf 的题目&#xff0c;提示了会使用 curl 连接输入的网站并返回响应包。 测试连接百度 直接在输入框中写 www.baidu.com 是无法连接的&#xff0c;需要在前面加入 http 或者 https &#xff0c;因为 curl 的使用方式就是&#xff1a; curl htt…

从0到1部署gitlab自动打包部署项目

本文重点在于配置ci/cd打包 使用的是docker desktop 第一步安装docker desktop Docker简介 Docker 就像一个盒子&#xff0c;里面可以装很多物件&#xff0c;如果需要某些物件&#xff0c;可以直接将该盒子拿走&#xff0c;而不需要从该盒子中一件一件的取。Docker中文社区、…

Ubuntu 常用命令之 man 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 man命令在Ubuntu系统中是一个非常重要的命令&#xff0c;它用于查看系统的手册页。手册页是Linux和Unix系统中的一种在线文档&#xff0c;用于描述系统中的命令、函数、配置文件等的详细信息。 man命令的基本格式是 man [选项] …