0502 网络编程

复习:正则模块
正则表达式
元字符 :
. 匹配除了回车以外的所有字符
w 数字字母下划线
d 数字
s 回车 空格 和 tab
^ 必须出现在一个正则表达式的最开始,匹配开头
$ 必须出现在一个正则表达式的最后,匹配结尾
| 或
a|b 要么取左边的要么取右边的
()|() 分组中的或 一定是长的在前面 短的在后面
[] 在同一个位置上可能出现的所有字符都放在组里
[^] 在同一个位置上不能出现的所有字符都放在组里
() 对于一整个组做量词约束 ; python 分组优先
量词 :
* 0、多次
+ 1、多
? 0、1
{} 具体的 {n},{n,m},{n,}
问好的用法
惰性匹配 : 量词+? 表示使用惰性匹配
分组优先 findall split ;取消分组优先 (?:。。。)
分组命名 (?P<name>...)
import re
ret=re.findall(r"d+","1-2*(60+(-40.35/5)-(-4*3))")
print(ret)
有的时候 不想要的内容需要被匹配出来
你不想要的东西包含着你想要的东西
ret=re.findall(r"d+.d+|(d+)","1-2*(60+(-40.35/5)-(-4*3))")
ret.remove('')
print(ret)

二、网络编程

软件开发的两种架构

应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用

web类:比如百度、知乎、博客园等使用浏览器访问就可以直接使用的应用

C/S即:Client与Server ,客户端与服务器端架构,几乎包含了所有网络开发的架构形态

B/S即:Browser与Server,浏览器端与服务器端架构,也是C/S架构,架构中的client都是browser浏览器

计算机之间是如何通信的?

广播

  主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。

ip地址与ip协议

  • 规定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示
  • 范围0.0.0.0-255.255.255.255
  • 一个ip地址通常写成四段十进制数,例:172.16.10.1
  • IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。

mac地址

  head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。

  mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

路由器

  路由器(Router),是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。路由器具有判断网络地址和选择IP路径的功能,它能在多网络互联环境中,建立灵活的连接,可用完全不同的数据分组和介质访问方法连接各种子网,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备。

局域网

  局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。由交换机连接在一起。

子网掩码 

  所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。

端口

  "端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。端口的范围: 0 - 65535只有用到联网通信的程序才会用到端口的概念。

  在同一台机器上 同一时刻 每一个端口只能为一个运行中的程序提供服务。ip + 端口 就可以找到全世界唯一的一台电脑上的一个程序。

 arp协议 ——查询IP地址和MAC地址的对应关系

  地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

TCP协议和UDP协议

  TCP 可靠的 面向连接 全双工的连接。三次握手 和 四次挥手

 三次握手

四次挥手

   UDP 不可靠的 面向数据包的 传输速度快 且不会长期占用系统的连接资源

 

 互联网协议与osi模型

 

 

 套接字(socket)

是模块 是和应用层直接交互,向下封装了应用层之下的相关协议的一组网络通信的接口

 基于TCP协议的socket

tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

服务server端
import socket
# 基于tcp协议的一次通信
sk = socket.socket()   # 买手机
# sk.bind(('192.168.11.53',9999))    # 装一张电话卡  bind绑定
sk.bind(('127.0.0.1',9999))    #把地址绑定到套接字
# 8000 - 10000
sk.listen()   # 开机  #监听链接
 
conn,addr = sk.accept()   # 等着 接电话  我们两个的连接,对方的地址 accept接受  #接受客户端链接
print(addr)
conn.send('你好'.encode('utf-8'))  #send 发送
ret = conn.recv(1024)   #1024  表示接受1024个字节
print(ret.decode('utf-8'))

conn.close()   # 挂电话 #关闭客户端套接字
sk.close()     # 关手机 #关闭服务器套接字(可选)

# 计算机的回环地址  127.0.0.1
客户client端
import socket

sk = socket.socket()   # 买个手机 # 创建客户套接字
sk.connect(('127.0.0.1',9999))   # 打电话  connect 连接  # 尝试连接服务器

ret = sk.recv(1024)  #recv接收  # 对话(发送/接收)
print(ret.decode('utf-8'))
sk.send('你也好'.encode('utf-8'))

sk.close()    # 关机  # 关闭客户套接字

tcp协议适用于 文件的上传和下载 发送邮件 发送重要的文件
每和一个客户端建立链接 都会在自己的操作系统上占用一个资源
同一时间 只能 和一个客户端通信

基于UDP协议的socket

udp是无链接的,启动服务之后可以直接接受消息不需要提前建立链接

在一个机房里 有一台标准时间的服务器
机房里所有的机器 都每隔一段时间 就去请求这台服务器 来获取一个标准时间
server
import time
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9090))
while True:
msg,addr = sk.recvfrom(1024)
sk.sendto(time.strftime(msg.decode('utf-8')).encode('utf-8'),addr)
sk.close()

client
import time
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
while True:
sk.sendto('%Y/%m/%d %H:%M:%S'.encode('utf-8'),('127.0.0.1',9090))
ret,addr = sk.recvfrom(1024)
print(ret.decode('utf-8'))
time.sleep(1)
sk.close()
原文地址:https://www.cnblogs.com/Mr-Murray/p/8981555.html