Python进阶系列
Python进阶-网络编程-01
Python进阶-网络编程-02
Python进阶-网络编程-03
Python进阶-多任务编程-01
Python进阶-多任务编程-02
Python进阶-多任务编程-03
Python进阶-正则表达式
Python进阶-数据库编程-01
Python进阶-数据库编程-02
Python进阶-数据库编程-03
Python进阶-数据库编程-04
Python进阶-数据拷贝问题
Python进阶-模块导入问题
Python进阶-miniWeb框架
文章目录
3.1. 系统性能定时监控-邮件监控
-
思路:
-
导入模块 import yagmail
-
创建发件对象
yagmail.SMTP(user=“发件人邮箱”, password=“邮箱授权码”, host=“发件服务器”)
-
发送邮件 obj.send(“收件人”,“主题”,“内容”)
# 判断 内存超过80% CPU超过80% if cpu_per > 80 or memory_info.percent > 90: # 创建发件对象 ya_obj = yagmail.SMTP(user="icoderi@163.com", password="py123456", host="smtp.163.com") # 发送邮件 ya_obj.send("py_test@126.com", "测试一下", content)
-
3.2. 虚拟环境
- python虚拟环境:允许安装不同版本的套件
- 创建:mkvirtualenv 虚拟环境名称( 默认python版本2.7)
- 进入:workon 虚拟环境名称
- 查看所在虚拟环境:workon + 回车
- 删除:1)先退出虚拟环境 2) rmvirtualenv 虚拟环境名称
- 退出:deactivate
- 创建虚拟环境,指定Python路径: mkvirtualenv -p /usr/bin/python3.6 xxx
- 在虚拟环境中安装套件: pip install 套件名==版本
3.3. 网络通信概述
- 定义:一些以共享资源为目的的计算机的集合
- 目的:能够网络编程
- 网络编程:通过编写程序实现计算机之间能进行数据的传递
3.4. IP地址
- IP地址:网络设备为网络中的每台计算机分配的一个唯一的标识
- IPv4地址 : 点分10机制 xxx.xxx.xxx.xxx 每一段0~255
- IP地址分类:常用的是C类地址
- 私有IP地址: 172.16.xxx.xxx 192.168.xxx.xx
- 本地地址: 127.0.0.1
- IPv6: 冒号分16进制
3.5. Linux命令(ping、ifconfig等)
- 虚拟机联网方式
- NAT:虚拟机跟物理主机共用网络
- 桥接:虚拟机能够获取局域网的IP地址
- ifconfig 查看IP地址
- ping 检测某个主机是否建立连接
3.6. 端口
-
端口:可以认为是设备与外界通讯交流的出口
-
分类:知名端口、动态端口
-
知名端口 0~1023 固定不变,用户也不能用
21 FTP服务
22 SSH服务
80 Web服务器
-
动态端口 1024~65535 程序可以绑定
-
-
端口查看 netstat
- 查看所有:netstat -an
- 搜索某一个端口:netstat -an | grep :22
- 查看某个端口,是那个程序使用:sudo lsof -i :22
3.7. 网络传输方式
- 面向无连接:两台计算机通信的时候,不需要建立连接就可以进行数据的收发,数据可能会丢
- 传输协议:UDP
- 面向有连接:两台计算机通信的时候,需要先建立连接,再能通信
- 传输协议:TCP
3.8. socket简介
-
socket :套接字+端口,网络通信的基本单元,提供的方法可以实现数据的发送和接收
-
创建套接字
-
导入模块
import socket
-
创建套接字
socket.socket(协议类型,传输方式) # 参数一: # socket.AF_INET 使用IPv4 # socket.AF_INET6 使用IPv6 # 参数二: # socket.SOCK_DGRAM 使用UDP的传输方式(无连接) # socket.SOCK_STREAM 使用TCP的传输方式(有连接) udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-
数据传输
-
关闭套接字
udp_socket.close()
-
-
两种连接方式
# 创建套接字,使用IPv4 UDP方式 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建套接字,使用IPv4 TCP方式 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3.9. udp网络程序-发送数据
-
sendto函数
# udp_socket.sendto(要发送的数据的二进制格式, 对方IP和端口号) # 参数一:字符串转换为二进制格式:字符串.encode() # 参数二:要求ip和端口号是一个元组:1)第一个元素字符串类型 ip地址 2)整数类型的端口号
-
代码示例:
# 1.导入模块 import socket # 2.创建套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 3.发送数据 udp_socket.sendto("helloworld!".encode(), ("192.168.70.1", 8080)) # 4.关闭套接字 udp_socket.close()
3.10. udp网络程序-发送并接收程序
-
udp_socket.recvfrom(1024)函数
# 返回的数据类型是元组类型 # 例:(b'4325', ('192.168.70.1', 8080)) # 元组的第一元素:接收的数据的字符串形式(打印时进行解码) # 元组的第二参数:对应的IP地址和端口号
-
代码示例:
# 1.导入模块 import socket # 2.创建套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 3.发送数据 udp_socket.sendto("哈哈,我来了".encode(encoding="GBK"), ("127.0.0.1", 8080)) # 4.接收数据(二进制) recv_data = udp_socket.recvfrom(1024) # 5.解码数据,得到字符串 recv_text = recv_data[0].decode("GBK") # 6.输出显示接收到的内容 print("来自:",recv_data[1],"的消息:",recv_text) # 7.关闭套接字 udp_socket.close()
3.11. python3编码转换
-
编码:字符串.encode() 默认UTF-8字符集
-
解码:二进制.decode() 默认UTF-8字符集
-
解码失败的处理
decode(encoding=“字符集”, errors=“错误处理方式”)
错误处理方式有两种:ignore 忽略, strict 严格
3.12. udp绑定端口
-
bind(address)函数
udp_socket.bind(address) # address 是一个元组,元组的第一个元素是字符串类型的IP地址,第二个元素是整数端口号 # ip地址可以省略,省略后表示自己的ip地址 # 绑定的是自己的IP地址和端口
-
代码示例:
# 1.导入模块 import socket # 2.创建套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 3.绑定端口 udp_socket.bind(("", 8888)) # 4.接收对方发送的数据 recv_data, ip_port = udp_socket.recvfrom(1024) # 5.解码数据 recv_data = recv_data.decode() # 6.输出显示 print("接收[%s]的信息:%s" % (str(ip_port), recv_data) # 7.关闭套接字 udp_socket.close()
3.13. UDP广播
-
广播权限setsockopt(套接字,属性,属性值)
udp_socket.setsockopt(套接字,属性,属性值) # socket.SOL_SOCKET 当前的套接字 # socket.SO_BROADCAST 广播属性
-
代码示例:
# 1.导入模块 import socket # 2.创建套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 3.设置广播权限 udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,True) # 4.发送数据 udp_socket.sendto("哈哈,的不过我吧".encode("gbk"), ("192.168.70.255", 8080)) # 5.关闭套接字 udp_socket.close()
3.14. udp聊天器
-
发送端
def send_msg(udp_socket): """发送信息""" # 接收方的IP地址 ipaddr = input("请输入接收方的IP地址:\n") if len(ipaddr) is None: ipaddr = "192.168.70.1" # 接收方的端口号 port = input("请输入接收方的端口号\n") if len(port) is None: port = 8080 # 接收方的内容 content = input("请输入要发送的内容\n") # 使用socket的sendto()发送信息 udp_socket.sendto(content.encode("gbk"),(ipaddr,int(port)))
-
接收端
def recv_msg(udp_socket): """接受信息""" # 使用socket接收数据 print("123") recv_data,ip_port = udp_socket.recvfrom(1024) print("123") print(recv_data) # 解码数据 recv_text = recv_data.decode() # 输出显示 print("接收到[%s]的消息:%s" % (str(ip_port),recv_text))
-
主程序
def main(): """程序入口""" # 1.创建套接字 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 2.绑定端口 udp_socket.bind(("192.168.70.1",8080)) # 3.打印莱单(循环) while True: print("**************************************") print("************* 1.发送信息 *************") print("************* 2.接收信息 *************") print("************* 3.退出系统 *************") print("**************************************") # 4.接收用户输入的选项 sel_num = int(input("请输入选项:\n")) # 5.判断用户的选择,并且调用对应的函数 if sel_num == 1: send_msg(udp_socket) elif sel_num ==2: recv_msg(udp_socket) elif sel_num == 3: print("系统正在退出……") print("系统退出完成") break # 6.关闭套接字 udp_socket.close()