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

一、分层模型

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的风采~😍😍😍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用Minikube 搭建一个单机k8s玩玩

Minikube 介绍 Minikube是一款单机搭建和管理Kubernetes集群的工具。与Kind 类似,但是个人认为比Kind 好用 Minikube 安装 mac如果安装了 Homebrew,直接执行以下命令安装minikube brew install minikubemac没有安装Homebrew,需要到官网下载选择系统配置…

【Prometheus|报错】Out of bounds

【背景】进入Prometheus地址的9090端口,pushgateway(0/1)error : out of bounds 【排查分析】 1、out of bounds报错,是由于Prometheus向tsdb存数据出错,与最新存数据的时间序列有问题,有可能当前时间与最…

VGGNet

目录 一、VGGNet介绍 1、VGG块 2、VGG架构 3、LeNet, AlexNet和VGGNet对比 4、总结 二、代码实现 1、定义VGG卷积块 2、VGG网络 3、训练模型 4、总结 一、VGGNet介绍 VGGNet(Visual Geometry Group Network)是一种深度卷积神经网络,…

Android Studio 安装和使用

前些天,打开了几年前的一个Android Studio app项目,使用安卓虚拟机仿真app崩溃,怀疑是不是中间升级过Android Studio导致异常的,马上脑子一热卸载了,结果上次踩过的坑,一个没少又踩一次,谨以此文…

系列十二(面试)、Java中的GC回收类型有哪些?

一、Java中的GC回收类型 1.1、概述 Java中的GC回收类型主要包含以下几种,即:UseSerialGC、UseParallelGC、UseConcMarkSweepGC、UseParNewGC、UseParallelOldGC、UseG1GC。 1.2、源码

Linux:sudo给予账户特定的权限

我们某些用户权限比较低,如果我们他们的权限提高,或者假如搞权限的组,那么会大大减少安全性,我们可以使用sudo对他们开放指定的命令 我这里有 a1—3 3个用户,现在我切换到a1执行一下重启的命令 发现我们这个用户并无…

【vtkWidgetRepresentation】第十六期 vtkContourRepresentation(三)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkContourLineInterpolator接口的源码剖析和实例应用,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 …

Uniapp 开发 BLE

BLE 低功耗蓝牙(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart),用于医疗保健、运动健身、安防、工业控制、家庭娱乐等领域。在如今的物联网时代下大放异彩,扮演者重要一环&#xff…

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

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

如何开发一套家政预约小程序,家政系统有哪些功能?

家政服务小程序保洁上门预约维修 同城师傅入驻抢单派单平台开发 家政保洁预约小程序的功能与特点; 一、功能介绍 1. 小程序与公众号无缝对接,支持员工预约、项目预约两种方式,用户可随时在线预约,享受便捷服务。 2. 商家在预约小程…

WiFi+蓝牙物联网定制方案——五大核心难点

WiFi蓝牙物联网定制方案可以根据具体需求进行定制: 1、设备连接方案:采用WiFi和蓝牙技术,将物联网设备与智能手机、平板电脑等设备进行连接,实现数据传输和远程控制。 2、数据传输方案:通过WiFi和蓝牙技术,…

安全基础~实战应用

文章目录 HTTP请求头应用X-Forwarded-ForHTTP动作练习(修改请求方式)浏览器信息伪造(修改User-Agent)来源请求伪造(referer应用) 密码的应用SQL注入漏洞测试(前部分)PHP_encrypt_1(ISCCCTF) XShell连接Linxu连接Windows连接 HTTP请求头应用 X-Forwarded-For 原理作用 一般的…

SpringBoot+Redis的Bloom过滤器

1.保姆级Linux安装Redis ①把redis.tar.gz下载到linux中,并用命令tar -zxvf安装 ②安装完成进入目录输入make进行编译,编译完成后输入make install 进行安装 ③创建两个文件夹mkdir bin mkdir etc 将redis目录下的redis.conf文件移动到etc文件中&…

磁盘类型选择对阿里云RDS MySQL的性能影响

测试说明 这是一个云数据库性能测试系列,旨在通过简单标准的性能测试,帮助开发者、企业了解云数据库的性能,以选择适合的规格与类型。这个系列还包括: * 云数据库(RDS MySQL)性能深度测评与对比 * 阿里云RDS标准版(x86) vs 经济…

医院影像科PACS系统源码,医学影像系统,支持MPR、CPR、MIP、SSD、VR、VE三维图像处理

PACS系统是医院影像科室中应用的一种系统,主要用于获取、传输、存档和处理医学影像。它通过各种接口,如模拟、DICOM和网络,以数字化的方式将各种医学影像,如核磁共振、CT扫描、超声波等保存起来,并在需要时能够快速调取…

Verilog基础:时序调度中的竞争(二)(创建分频时钟时,使用阻塞赋值)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 作为一个硬件描述语言,Verilog HDL常常需要使用语句描述并行执行的电路,但其实在仿真器的底层,这些并行执行的语句是有先后顺序…

汽车制造厂设备故障预测与健康管理PHM

在现代汽车制造工业中,设备的可靠性和稳定性对于保证生产线的高效运行至关重要。为了提高生产效率、降低维修成本以及确保产品质量,汽车制造厂逐渐采用设备故障预测与健康管理(PHM)系统,以实现对设备状态的实时监测和预…

第11章 GUI Page411~420 步骤五 支持其他图形

运行效果&#xff1a; 源代码 //item_i.hpp 抽象“图形元素”接口定义 #ifndef ITEM_I_HPP_INCLUDED #define ITEM_I_HPP_INCLUDED#include <wx/gdicmn.h> #include <wx/dc.h>class IItem { public://作为接口&#xff0c;记得要有虚析构virtual ~IItem(){}//使用…

linux静态ip配置方法(vmware虚拟机)

1、背景 自己搭建了一个虚拟机&#xff0c;vmware虚拟机&#xff0c;如果使用动态ip,经常变换地址&#xff0c;登录不方便。 优点&#xff1a; 静态网络配置的好处是该服务器地址是静态ip的&#xff0c;不会随着网络更换而出现波动。 2、配置方法 2.1 进入centos系统&#…

算法与数据结构--散列表与哈希算法

引入 我们知道c的set和unorder_set&#xff08;map本质上也是set&#xff0c;就是把set的存储对象换成键值对结构体&#xff09;&#xff0c;set底层是红黑树实现的&#xff0c;那么unorder_set是怎么实现的呢&#xff1f;这一节就来讲讲实现unorder_set的哈希表&#xff0c;也…