网络 实现资源共享 信息传递 的虚拟平台
要使用编程实现多台计算机的网络通讯 需要具备网络编程的三个要素
1.IP地址 :设备在网络中的唯一标识 ipv4(4字节 10 进制 一个 byte -128 127)一般 0 1 2 255 不用 可能被设置为网关
ipv6 8字节16进制
linux 与mac 使用 ifconfig windows 使用 ipconfig 后面加-all 可以查mac地址 物理地址
2.端口 : 进程在设备上的唯一标识 0 ~ 65535
用于标识 进程的逻辑地址 通过端口 找到指定的进程 端口是传输数据的通道
每运行一个程序都会有一个端口号
知名端口号: 0 -1023
动态端口号: 102465535
3.协议: : 通讯规范
分类:
tcp协议特点: 面向有连接 采用次节流的方式进行数据传输 安全可靠 效率相对较低 区分服务器和客户端
udp 协议特点:面向无连接 采用数据报包的方式 每个包不超过64kb 不安全 效率相对较高 叫发送端和接收端
tcp协议 : 必须 先建立连接 在传输数据 后关闭连接
三次握手:建立传输通道
四次挥手:双向的双方都得发送一次 关闭请求
192 176 10 局域网
socket 套接字 :
进程之间的网络通讯工具
导包 import sockst
网络编程 : 也叫网络通讯 ,socket通讯 即通讯双方都都有自己的socket对象
数据在socket 直接通讯,数据报包(udp)协议 或者字节流(tcp协议)的形式进行传输
TCP 程序开发流程:
服务器端开发流程:
创建服务器端socket对象 s = socket.socket()
绑定ip地址和端口号 元组(ip,端口号) s.bind(ip,端口)
设置监听数 最大监听数 s.listen(数字)
等待客户端申请建立连接 (等待接受) 拆包 a,b =s.accept()
给客户端发送数据 b是将数据转化为2进制的 a.send(b"".encode('UTF-8')) # 发出指令 字符串前要带 b'里面是英文' 或者"里面是中文".encode('UTF-8')
接受客户端的信息并打印 1024为单次会话上线 data = a.recv(1024).decode('UTF-8')
释放资源 (服务器不关闭 一般不用写) a.close()
细节 客户端与服务器通过()bytes)字节流的形式进行实现
客户端开发流程:
创建客户端socket对象 c = socket.socket()
连接服务器端,指定的服务器端的ip 接口号 c.connect((ip,端口))
接收服务器端的信息打印 data = c.recv(1024).decode('UTF-8')
给服务器发消息
释放资源
编码与解码:
编码
把我们看的懂的转成看不懂的
'字符串'.enconde(码表)
解码
把我们看不懂的转为我们看得懂的
二进制.deconde(码表)
英文 字母 符号 无论什么码表都只占用 1个字节 gbk 中文占 2字节 utf 8 占3字节
只要乱码 就是 编解码不同
二进制数据特殊写法,即 b'数字 字母 符号' 中文无效
encode() 里面不写 默认UTF-8
多任务 : 同一时间内 执行多个任务
两种表现形式:
并发: 一段时间内 交替执行任务
并行: 在一段时间呢,真正的同时一起执行多个任务
进程:
概念:cpu资源分配的最小单位, 操作系统进行资源分配调度运行的最小单位
一个正在运行的程序就是一个进程
作用:
一个进程运行后又创建了一个进程为子进程
进程的创建步骤:
1.导包 import multiprossing
2. 通过进程类 实例化对象 p1 = multiprocessing.Process(target=函数名)
启动进程执行对象 p1.star()
进程编号:唯一标识一个进程 方便管理进程 程序是释放后 进程id也会释放
目的:验证父进程 和子进程的关系 方便管理
os.getpid() 查看当前进程的 进程id
os.getppid()
细节: main中创建进程 如果没有特殊的指定他的父进程都是main进程
而main进程的父进程都是pycharm 的程序pid
注意: 进程之间不共享全局变量 数据之间是相互隔离的 子进程相当于父进程的 副本 会将父进程 的main外资源拷贝一份 即 各是各的
默认情况下 主进程会等待所有子进程结束再结束
如果要设置主进程结束 子进程同步关闭 1. 设置守护进程(设置完毕后 若 主进程结束 子进程直接结束) p1.daemon=True
2.强制关闭子进程,可以导致变成僵尸进程 交给python解释器自动回收 p1.terminate() 销毁子进程