python高级编程 网络编程
一、网络通信概述
1、什么是网络
网络是一种辅助双方或者多方能够连接在一起的工具
如果没有网络,单机的世界是多么的孤独啊
2、使用网络的目的
联通多方然后进行通信用的,即把数据从一方传递给另一方
用网络能够把多方连接在一起,然后可以进行数据传递
网络编程就是:让不同的电脑上的软件能够进行数据传递,即进程之间的通信
二、TCP/IP协议
1、协议
如何实现网络通信:通过协议
协议:大家彼此都认可的一个条款
比如,有的人说英语,有的人说中文,有的人说德语,说同一种语言的人可以交流,不同的语言之间就不行了。为了让解决不同种族人之间的语言沟通障碍,就规定国际通用语言是英语,这就是一个规定
,就是协议
那么不同种类之间的计算机(windows、linu、mac)是怎么进行数据传递
的呢,网络通信的协议是什么呢?
就像说不同语言的人沟通一样,只要有一种大家都认可都遵守的协议即可,那就是计算机遵守的网络通信协议:TCP/IP协议
2、TCP/IP协议(族)
(1)TCP/IP协议
互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以大家把互联网协议简称为TCP/IP协议
(2)IP地址
地址就是用来标记地点的
IP地址是用来在网络中标记一台电脑的一串数字
比如:192.168.1.1
在本地局域网中,IP地址是唯一的
IP地址的分类:
每一个IP地址包括两部分:网络地址,主机地址
对于一个IP地址:172.25.254.1/24
IPV4是点分十进制,一共有32位,分为4段,每段8位,每段的范围是0~255
在172.25.254.1/24中,/24代表网络地址有24位,也就是说前三段 172.25.254是网络地址,剩下的一段 1是主机地址
IP地址可以分为5类:
平时不考虑网络地址还是主机地址
3、一些概念
(1)私网IP:
网络IP中,国际规定有一部分IP地址是用于局域网使用的,也就是属于私网IP,不在公网中使用,它们的范围是:
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
(2)回环地址IP
IP地址127.0.0.1代表本机IP地址,等价于localhost,
用http://127.0.0.1就可以测试本纪中配置的Web服务器
(3)子网掩码
子网掩码不能单独存在,它必须结合IP地址一起使用
子网掩码的作用:将某个IP地址划分成网络地址和主机地址两部分
子网掩码的设定必须遵循一定的规则,用来判断两个IP是否在同意个网络
子网掩码可以表示为两种形式:
比如:255.255.255.0,或者是24
255.255.255.0它转换成二进制是11111111 11111111 111111110就等价于24,也就是说IP地址的前24位是网络地址
如果两个IP地址的网络地址相同,那么这两台主机就可以进行通信
例如:
A主机:172.25.254.18/24
B主机:172.25.0.10/24
它俩的网络地址是前24位,明显不同,所以不能通信
如果是
A主机:172.25.254.18/16
B主机:172.25.0.10/16
网络地址是前16位,相同,则可以进行通信
(4)端口:
我们常见的的一些服务和它的端口号
sshd(22)、mysql(3306)、redis(6379)、http(80)、https(443)、ftp(21)
端口就好比一个房子的门,是进入这间房子的必经之路
端口号只有整数,范围是0 ~ 65535
端口是唯一标识计算机上的进程,便于不同计算机进程之间进行交流,
为什么不用PID(也是唯一标识)来表示呢,因为当我关闭一个进程再打开的时候,PID是会改变的
查看规定好的服务的端口号:
cat /etc/services | less
三、socket编程
1、网络进程间通信
本地进程间通信:
相同主机之间进行进程间通信的方式有:管道、消息队列、同步(互斥锁、条件变量等)
网络进程间通信:
本地通过进程的PID来唯一标识一个进程,在网络中如何唯一标识一个进程呢?
网络层的 “IP地址” 可以唯一标识网络中的主机,而传输层的 “协议+端口”可以唯一标识主机中的 应用程序(进程)。
因此利用IP地址,协议,端口 就能标识网络的进程。
因此通过IP确定沟通的主机,通过TCP/IP协议沟通,根据端口号唯一标识不同主机之间的进程。
2、什么是socket
socket,简称套接字,是进程间通信的一种方式,能实现不同主机之间的进程的通信。我们网络上各种各样的服务大多是基于socket来完成通信的。比如: pymysql、qq等应用的底层都是用Sccket来封装的
3、创建socket
在python中使用socket模块中的socket()函数就可以完成:
socket.socket(AddressFamily , type)
AddressFamily:地址协议,
有两种:
AF_INET:IPV4(点分十进制)用于internet进程间通信
AF_INET6:IPV6(冒分十六进制)用于internet进程间通信
是网络层协议
Type:套接字类型
,有两种:
SOCK_STREAM:流式套接字,主要用于TCP协议
SOCK_DGRAM:数据报套接字,主要用于UDP协议
是传输层协议
有一些默认值
import socket
# 1. 创建socket对象
# family: AF_INET(IPv4) AF_INET6(IPv6) ========= 网络层协议
# type: # SOCK_STREAM(TCP) SOCK_DGRAM(UDP) ========== 传输层协议
# Linux: socket可以认为是一个文件;
socketObj = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
print(socketObj.getsockname())
#2. 关闭socket对象
socketObj.close()
# 2. socket基本使用
import os
os.system('hostname') #linux命令获取主机名
hostname = socket.gethostname() #python中用socket模块获取主机名
print("主机名:", hostname) #LAPTOP-KUD6IFIG
print(socket.gethostbyname('localhost')) #127.0.0.1
4、UDP介绍
(1)什么是UDP
UDP ⽤户数据报文协议
,是⼀个⽆连接
的简单的⾯向数据
报的传输层协议
。UDP不提供可靠性,它只是把应⽤程序传给IP层的数据报发送出去,但 是并不能保证它们能到达⽬的地。由于UDP在传输数据报前不⽤在客户和服务器之间建⽴⼀个连接,且没有超时重发等机制,故⽽传输速度很快。
UDP是⼀种⾯向⽆连接的协议,基于数据报文传输的,每个数据报都是⼀个独⽴的信息,包括完整的源地址或⽬的地址,它在⽹络上以任何可能的路径传往⽬的地,因此能否到达⽬的地,到达⽬的地的时间以及内容的正确性都是不能被保证的。
(2)UDP的特点
UDP是⾯向⽆连接的通讯协议,UDP数据包括⽬的端⼝号和源端⼝号信息, 由于通讯不需要连接,所以可以实现⼴播发送。
UDP传输数据时有⼤⼩限制,每个被传输的数据报必须限定在64KB之内。
UDP是⼀个不可靠的协 议,发送⽅所发送的数据报并不⼀定以相同的次序到达接收⽅。
优点:传输速度快
缺点:数据有可能丢失,不可靠
UDP结构:
源端口:源端口号。在需要对方回信时选用。不需要时可用全0。
目的端口:目的端口号。这在终点交付报文时必须要使用到。
长度: UDP用户数据报的长度,其最小值是8(仅有首部),最多2^32-1 = 64KB。
校验和:检测UDP用户数据报在传输中是否有错。有错就丢弃
(3)UDP应用场景
UDP是⾯向消息的协议,通信时不需要建⽴连接,数据的传输⾃然是不可靠的,UDP⼀般⽤于多点通信和实时的数据业务,⽐如:
语⾳⼴播 、
视频、QQ、(丢了没关系,在连接一次)
TFTP(简单⽂件传送)、
SNMP(简单⽹络管理协议) 、
DNS(域名解释)
5、UDP网络程序
服务端(UDP Server):提供服务
创建socket对象 ---- 绑定IP和端口 ---- 接收信息 ---- 发送消息(一个响应) ---- 关闭
客户端(UDP Client):访问提供的服务
创建socket对象 ---- 发送消息 ---- 接收消息 ---- 关闭
同一个目录下创建两个.py文件
服务端.py ; 客户端.py
"""服务端"""
import socket
# 1.实例化socket对象
udpServer = socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM)
# 2.绑定IP和端口,是一个元组
# 121.0.0.1代表本地IP
udpServer.bind(('0.0.0.0', 9001)) #0.0.0.0代表开放所有的IP地址
print('等待客户端UDP的连接。。。')
# 3.接收客户端的消息
recvdata, address = udpServer.recvfrom(1024) # 会有两个返回值:发送的消息;哪个地址发来的(IP地址,端口地址)。是一个元组。最多1024个字节
print('接收到客户端的数据为:',recvdata.decode('utf-8'))