Python进阶-网络编程-01

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. 系统性能定时监控-邮件监控

  • 思路

    1. 导入模块 import yagmail

    2. 创建发件对象

      yagmail.SMTP(user=“发件人邮箱”, password=“邮箱授权码”, host=“发件服务器”)

    3. 发送邮件 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 :套接字+端口,网络通信的基本单元,提供的方法可以实现数据的发送和接收

  • 创建套接字

    1. 导入模块

      import socket
      
    2. 创建套接字

      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)
      
    3. 数据传输

    4. 关闭套接字

      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()
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值