python2和python3的区别
python2:str/bytes是一类,都是以字节的形式存储,unicode又是单独一类,用unicode的形式存储;默认编码是ascii码,需要在文件开头写: #-*- encoding:utf-8 -*-;有新式类和经典类存在
python3:str和bytes区分开来了,str用unicode存储,bytes用字节存储;全是新式类
作用域的坑
f = [lambda x :x + i for i in range(10)] """转换成函数""" def func(x): for i in range(10): pass return x + i # i = 9(作用域的问题) ret = func(5) print(ret) # 输出结果: 14
网络知识
两个计算机之间的连接
一根网线搞定,电脑有网卡,网卡有mac地址
DHCP
到某个地方插上网线,路由器或交换机中的DHCP服务就会为计算机自动分配IP地址
IPv4:4段8位表示,共32位,用10进制表示,每段范围是0~255,表示每个局域网中计算机的理论上限为256台
IPv6:IPv4的扩充,6段8位,共128位,16进制表示
子网掩码
默认值:255.255.255.0
一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。
作用:就是将某个IP地址划分成网络地址和主机地址两部分(挡住的IP作为网段,为挡住的部分作为可变的值)用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。
网关
路由器中连接交换机的口,一般以局域网中的第一个地址表示,即:xxx.xxx.xxx.1
arp协议
地址解析协议:根据IP地址获取mac地址的一个TCP协议,主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源
作用:网络工作分为七层,IP地址在OSI模型的第三层,MAC地址在第二层,彼此不直接打交道。在通过以太网发送IP数据包时,需要先封装第三层(32位IP地址)、第二层(48位MAC地址)的报头,但由于发送时只知道目标IP地址,不知道其MAC地址,又不能跨第二、三层,所以需要使用地址解析协议。使用地址解析协议,可根据网络层IP数据包包头中的IP地址信息解析出目标硬件地址(MAC地址)信息,以保证通信的顺利进行。
工作过程
主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;
主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;
当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:
- 根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。
- 如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
- 主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
- 主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
- 当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机发送IP通信了。
线程
import time import threading def task(n): print('开始执行任务:',n) time.sleep(10) print('...') print('任务%s 执行完毕:'%n) while True: name = input("请输入任务:") t = threading.Thread(target=task,args=(name,)) t.start()
线程和socket的配合
import time import socket import threading def task(conn): time.sleep(20) data = conn.recv(1024) print(data) conn.close() server = socket.socket() server.bind(('192.168.13.84',8001,)) server.listen(5) while True: conn,addr = server.accept() t = threading.Thread(target=task,args=(conn,)) t.start()