Python(11):网络编程

文章目录

  • 一、一些基本概念
  • 二、软件的开发架构(c/s架构和b/s架构)
  • 三、OSI模型
  • 四、socket套接字编程
    • 1.socket编程过程
    • 2.python中的socket编程

一、一些基本概念

来了解一些网络的基本概念

名词解释
IP(互联网协议地址)IP用来标识网络中的一个通信实体的地址。互联网之间的通信相当于快递收发,需要知道每个电脑的详细地址才能实现数据的准确收发。2.广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示。范围: 0.0.0.0-255.255.255.255
子网子网就是一个网中一个比较低级的网
子网掩码子网掩码用来确定一个子网中的IP地址及数量,一个子网节点IP地址与子网掩码相与运算得到该子网下的IP地址。一般的子网掩码为255.255.255.0。通过子网掩码确定两个IP地址是否属于同一个子网。
网关网络络关卡口的简称。他的作用就是:链接两个不同的网络,比如联通公司给你家装了宽带(相当于给你家装了一个网关),你家里的所有设备都是在一个局域子网中,这个局域网和互联网之间使用网关进行连接。
交换机交换机的作用就是分发数据,为设备提供IP地址。交换机直接与设备的网卡连接,数据通过指定的端口发送到指定的设备上,交换机只关心与其联系的设备的mac地址。
路由器路由器具备WAN口和多个LAN口。它实际上是**网关和交换机的结合体。**wan口与宽带公司机房相连,LAN口与局域网设备相连。
路由数据从一台电脑发送到另一台电脑的时所走过的路线就叫做路由。
端口同一台设备下有很多的应用程序,但是网卡只有一个,数据通过网卡获得和发送,如何确定接收的数据到底是哪一个程序的呢?发给QQ的数据不可能被微信接收。利用端口可以解决这个问题。
mac地址每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
局域网(Local Area Network,LAN)指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。

二、软件的开发架构(c/s架构和b/s架构)


了解的涉及到两个程序之间通讯的应用大致可以分为两种:

  • 应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用
  • web类:比如百度、知乎、博客园等使用浏览器访问就可以直接使用的应用

这些应用的本质其实都是两个程序之间的通讯。而这两个分类又对应了两个软件开发的架构~

1.C/S架构
C/S架构:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。
​​​​在这里插入图片描述

这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。

2.B/S架构
B/S架构:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。
在这里插入图片描述

浏览器其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的网页资源,客户端浏览器就能进行增删改查。

三、OSI模型

互联网的核心就是由一堆协议组成,协议就是标准。所有的计算机都学会了互联网协议,那所有的计算机都就可以按照统一的标准去收发信息从而完成通信了。人们按照分工不同把互联网协议从逻辑上划分了层级:

在这里插入图片描述
每一层都有自己的好多协议,这里有个神图,大概了解一下
在这里插入图片描述
这里我们重点看一下传输层的TCP和UDP:

TCPUDP
简介Transmission Control Protocol ,传输控制协议User Data Protocol ,用户数据报协议
优点一个可靠的、面向连接的协议传输效率高(发送前时延小),支持一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制
缺点传输效率低、面向字节流不可靠的、无连接的协议
应用Web浏览器;电子邮件、文件传输程序域名系统 (DNS);视频流;IP语音(VoIP)

TCP的三次握手

TCP是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 而一个TCP 连接必须要经过三次 “ 对话 ” 才能建立起 来,其中的过程非常复杂,图示如下:
​​​​在这里插入图片描述

简单描述一下:

  1. 第一步,客户端发送一个包含SYN 即同步( Synchronize )标志的 TCP 报文, SYN 同步报文会指明客户端使用的端口以及TCP 连接的初始序号。
  2. 第二步,服务器在收到客户端的SYN 报文后,将返回一个 SYN+ACK 的报文,表示客户端的请求被接受,同时TCP 序号被加一, ACK 即确认( Acknowledgement )
  3. 第三步,客户端也返回一个确认报文ACK 给服务器端,同样 TCP 序列号被加一,到此一个 TCP 连接完成。然后才开始通信的第二步:数据处理。

TCP的四次挥手

断开链接也需要进行四次挥手操作,图示如下:
在这里插入图片描述
简单描述就是:

  1. 当主机A完成数据传输后,将控制位FIN置1,提出停止TCP 连接的请求 ;
  2. 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1;
  3. 由B 端再提出反方向的关闭请求, 将 FIN 置 1 ;
  4. 主机A对主机B 的请求进行确认,将 ACK 置 1 ,双方向的关闭结束 。

四、socket套接字编程

1.socket编程过程

Socket 是传输层供给应用层的编程接口,所以Socket 编程就分为 TCP 编程和 UDP 编程两类。
在这里插入图片描述

2.python中的socket编程

Python 中,我们用 socket() 函数来创建套接字。

服务器端套接字函数

函数描述
s.bind()绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。
s.listen()开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
s.accept()被动接受TCP客户端连接,(阻塞式)等待连接的到来

客户端套接字函数

函数描述
s.connect()主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
s.connect_ex()connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数

函数描述
s.recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
s.send()发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
s.sendall()完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
s.recvfrom()接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
s.sendto()发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
s.close()关闭套接字
s.getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
s.getsockname()返回套接字自己的地址。通常是一个元组(ipaddr,port)
s.setsockopt(level,optname,value)设置给定套接字选项的值。
s.getsockopt(level,optname[.buflen])返回套接字选项的值。
s.settimeout(timeout)设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
s.gettimeout()返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。
s.fileno()返回套接字的文件描述符。
s.setblocking(flag)如果 flag 为 False,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用 recv() 没有发现任何数据,或 send() 调用无法立即发送数据,那么将引起 socket.error 异常。
s.makefile()创建一个与该套接字相关连的文件

我们来试验一下:
server.py

import socket

# 创建 socket 对象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()

# 绑定端口号
serversocket.bind((host, 9999))

# 设置最大连接数,超过后排队
serversocket.listen(5)

while True:
    # 建立客户端连接
    clientsocket, addr = serversocket.accept()

    print("连接地址: %s" % str(addr))

    msg = '我是server.py文件' + "\r\n"
    clientsocket.send(msg.encode('utf-8'))
    clientsocket.close()

client.py

# 导入 socket、sys 模块
import socket

# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()

# 连接服务,指定主机和端口
s.connect((host, 9999))

# 接收小于 1024 字节的数据
msg = s.recv(1024)

s.close()

print(msg.decode('utf-8'))

运行这两个文件,会在client.py运行结果看到:

在这里插入图片描述

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

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

相关文章

【Redis 神秘大陆】001 背景基础理论

一、背景&基础理论 1.1 什么是缓存 缓存:存储在计算机上的一个原始数据复制集,以便于访问——维基百科 1.2 为什么用缓存 提升用户体验: 【即效率、效益和基本主观满意度】CAST 使用者的状态、系统性能及环境,不同的人对于…

二维码生成器怎么做网址活码?链接制作二维码的方法

如何使用网址二维码生成器的功能来制作二维码呢?现在很多人会将网址生成二维码之后,分享给其他人通过手机扫码来打开网页获取内容,这种方式有利于网页的快速传播与分享,而且可以让更多的人同时访问对应的网页。那么网址转二维码的…

《二》Qt Creator工具介绍与使用

一、关于界面 点击文件--->新建文件或项目会出现如下图: 我们选择第一个 点击下一步下一步: 继续下一步直到结束: 二,具体文件介绍 我们点击pro查看以下 QT core gui第1行 表示使用qt的core和gui库,如果以后…

【C++程序员的自我修炼】日期类Date的实现

山河日月镌刻璀璨初心 八载春秋写就举世华章 目录 日期类Date的实现 构造函数 拷贝构造函数 获取月份天数的函数 日期类的检查 日期类的打印 运算符重载日期类的比较 运算符重载> 运算符重载 运算符的复用 日期加天数 日期减天数 ​编辑 运算符重载 运算符重载- 日期类的前…

11.盛最多水的容器(Java,双指针)

目录 题目描述:输入:输出:代码实现: 题目描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同…

PHP01——php快速入门 之 在Mac上使用phpstudy快速搭建PHP环境

PHP01——php快速入门 之 在Mac上使用phpstudy快速搭建PHP环境 0. 前言1. 下载小皮面板1.1 下载phpstudy(小皮面板)1.2 启动、简单访问1.2.1 启动Apache1.2.2 访问1.2.3 访问自定义文件或页面 2. 创建网站2.1 创建网站2.2 可能遇到的问题2.2.1 hosts权限…

企业指标开发流程新主张

作为数据开发人员,你是否在指标开发过程中有过如下苦恼: Q1、 (甲方)业务人员:你这个指标计算逻辑不对,我们前期不是这么对的。 (乙方)卑微的你:Fu*k……我有录音。 …

创建和使用pipenv

创建pipenv 1.环境区别2.安装pipenv3.使用1.创建项目名称2.创建pipenv环境3.安装包1.安装包卡顿或卡住 4.查看包之间联系5.进入虚拟环境6.只安装dev环境的包7.常见的pipenv指令 1.环境区别 真实环境 真实环境可能被系统的其他软件依赖,下载包可能导致其他软件环境变…

Spark Standalone模式部署

准备至少2台虚拟机,装好linux系统,我装的是Ubuntu20.04。 1.修改主机名(每台) 1)修改/etc/hostsname内容,主节点改为master,子节点改为slaver1 sudo vim /etc/hostname 2)在/etc/…

【面试经典 150 | 数学】阶乘后的零

文章目录 写在前面Tag题目来源题目解读解题思路方法一:数学优化计算 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结…

防御性编程失败,我开始优化我写的多重 if-else 代码

最近防御性编程比较火,码农出身(前后端内推)的我不得试试 不出意外我被逮捕了,组内另外一位同事对我的代码进行了 CodeReview,我的防御性编程编程没有幸运逃脱,被标记上了“多重 if-else ”需要进行优化。 …

数据结构速成--链表

由于是速成专题,因此内容不会十分全面,只会涵盖考试重点,各学校课程要求不同 ,大家可以按照考纲复习,不全面的内容,可以看一下小编主页数据结构初阶的内容,找到对应专题详细学习一下。 目录 一…

中仕公考:2024山东高校毕业生“三支一扶”开始报名

2024年度山东省高校毕业生‘三支一扶’计划开始报名,此次全省共计招募1350名。 招募范围: 30周岁及其以下的山东省内普通高校全日制毕业生(1993年4月以后出生) 报名时间:2024年4月16日9:00—4月20日16:00 查询时间:2024年4月1…

在Docker里面修改mysql的密码(8.0以上版本)

介绍 我们在阿里或者华为的服务器上安装了mysql而且还公开了端口3306恰好你创建的容器的端口也是3306;那么我建议你修改mysql的密码,而且越复杂越好,因为我就被黑客给攻击过 修改密码 首先我们要启动好mysql容器 进入容器内部 **docker exec -it mysql bash ** 登入初始…

Qt for Android 开发环境

在搭建环境时开始感觉还挺顺利的,从 Qt 配置的环境里面看并没有什么问题,可真正编译程序的时候发现全是错误。 最开始的时候安装了 JDK21 最新版本,然后根据 JDK21 安装 ndk, build-tools, Platform-Tools 和 Gradle,但是不管这么…

基于SpringBoot+Vue的城镇住房管理系统(源码+文档+包运行)

一.系统概述 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了城镇保障性住房管理系统的开发全过程。通过分析城镇保障性住房管理系统管理的不足,创建了一个计算机管理城镇保障性住房管理系统的方案。文章…

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations) 1、污点(Taints)2、容忍度(Tolerations)3、示例演示-测试污点的具体应用场景3.1 给节点打污点&…

ThinkPHP V5.1框架源码

源码下载地址:ThinkPHP V5.1.zip www WEB部署目录(或者子目录) ├─application 应用目录 │ ├─common 公共模块目录(可以更改) │ ├─module_name 模块目录 │ │ ├─common.php 模块函数文件 │ │ ├─controll…

Springboot+Vue项目-基于Java+MySQL的免税商品优选购物商城系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

DBA面试总结(Mysql篇)

一、delete与trancate的区别 相同点 1.两者都是删除表中的数据,不删除表结构 不同点 1.delete支持按条件删除,TRUNCATE不支持。 2.delete 删除后自增列不会重置,而TRUNCATE会被重置。 3.delete是逐条删除(速度较慢&#xff09…