Python网络开发基础,实现udp聊天器小案例

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python网络开发基础,实现udp聊天器小案例相关的知识,希望对你有一定的参考价值。

文章目录


1. 实战:《系统性能定时监控》-邮件监控

思路:

  • 导入模块 improt yagmail
  • 创建发件对象 yagmail.SMTP(user=“发件人邮箱”, password=“邮箱授权码”, host=“发件服务器”)
  • 发送邮件 obj.send(“收件人”, “主题”, “内容”)
# 判断 内存超过80%  CPU超过80%
    if cpu_per > 80 or memory_info.percent > 90:
        # 8、发送邮件
        ya_obj = yagmail.SMTP(user="icoderi@163.com", password="py123456", host="smtp.163.com")
        # 8.1、使用yagmail 对象发送邮件(指定收件人、邮件主题、发送的内容)
        # send(指定收件人、邮件主题、发送的内容) 发送邮件
        ya_obj.send("py_test@126.com", "[系统监控报告]", log_str)

2. 虚拟环境

python虚拟环境:允许安装不同版本的套件

  • 创建:mkvirtualenv 虚拟环境名称 默认python版本2.7
  • 进入:workon 虚拟环境名称
  • 查看所虚拟环境: workon + 回车
  • 删除:1)先退出虚拟环境 2) rmvirtualenv 虚拟环境名称
  • 退出:deactivate
  • 创建虚拟环境,指定Python路径: mkvirtualenv -p /usr/bin/python3.6 xxx
  • 在虚拟环境中安装套件: pip install 套件名==版本

3. 网络通信概述

  • 什么是网络:

    一些以共享资源为目的的计算机的集合

  • 学习网络的目的:

    能够网络编程。

    网络编程:通过编写程序实现计算机之间能进行数据的传递

4. [重点]ip地址(重点)

  • ip地址:网络设备为网络中的每台计算机分配的一个唯一的标识
  • ip地址v4 : 点分 10机制 xxx.xxx.xxx.xxx 每一段0~255
  • ip地址分类:常用的是C类地址
  • 私有IP地址: 172.16.xxx.xxx 192.168.xxx.xx
  • 本地地址: 127.0.0.1
  • IPv6: 冒号分16进制

5. Linux命令(ping、ifconfig等)

  • 虚拟机联网方式
    • NAT 虚拟机跟物理主机共用网络
    • 桥接: 虚拟机能够获取局域网的IP地址(同学之间互相访问)
  • ifconfig 查看IP地址
  • ping 检测某个主机是否建立连接

6. [重点]端口(重点)

  • 端口:可以认为是设备与外界通讯交流的出口

  • 分类:知名端口、动态端口

    • 知名端口 0~1023 固定不变,用户也不能用

      21 FTP服务

      22 SSH服务

      80 Web服务器

    • 动态端口 1024~65535 程序可以绑定

  • 端口查看 netstat

    • 查看所有:netstat -an
    • 搜索某一个端口:netstat -an | grep :22
    • 查看某个端口,是那个程序使用:sudo lsof -i :22

7. [重点]网络传输方式

  • 面向无连接

    两台计算机通信的时候,不需要建立连接(逻辑)就可以进行数据的收发,数据可能会丢

    • 传输协议: UDP
  • 面向有连接

    两台计算机通信的时候,需要先建立连接,再能通信

    • 传输协议:TCP

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()

9. [重点]udp网络程序-发送数据

思路:

  • 导入模块

    import socket

  • 创建套接字

    # socket.AF_INET  IPv4
    # socket.SOCK_DGRAM UDP
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
  • 发送数据

    udp_socket.sendto(数据,ip和端口)

    • 数据必须是二进制格式 字符串.encode()
    • ip和端口必须是是元组,(“ip地址”, 端口号)
  • 关闭连接

    upd_socket.close()

win系统需要开启网络调试助手

  • 设置 协议方式 UDP
  • 设置ip地址
  • 设置端口
  • 连接网络

10. [重点]udp网络程序-发送并接收数据

  • 发送数据,同上

  • 接收数据

    recv_data = udp_socket.recvfrom(1024) 每次接收1024个字节

    recv_data 是一个元组

    1)第一个元素 收到的数据的二级制

    2)第二个元素 元组,发送方的ip和端口

    • 把接收的数据解码 二进制 —》 字符串

      二进制数据.decode(“GBK”)

11. [重点]python3编码转换

  • 编码

    字符串.encode() 默认UTF-8字符串

  • 解码

    二进制.decode() 默认UTF-8字符集

  • 解码失败的处理

    decode(encoding=“字符集”, errors=“错误处理方式”)

    错误处理方式有两种:ignore 忽略, strict 严格

12. udp绑定端口-发送端

  • 核心方法,bind()

    # udp_socket.bind(address)
    # address 是一个元组,元组的第一个元素是字符串类型的IP地址,第二个元素 整数端口号
    udp_socket.bind(("192.168.150.25", 8888))
    

    绑定,必须绑定自己的地址

13. [重、难点]udp绑定端口-接收端

  • bind()

    udp_socket.bind(("", 8888))

    ip地址尽可能写为"",好处当计算机由多个网卡的时候,不同网卡的数据都能被接收

14. UDP广播

广播地址:xxx.xxx.xxx.255 或者 255.255.255.255

思路:

  • 导入模块

    import socket

  • 创建套接字

    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

  • 设置广播权限

    # PermissionError: [Errno 13] Permission denied
    # udp_socket.setsockopt(套接字,属性,属性值)
    # socket.SOL_SOCKET 当前的套接字
    # socket.SO_BROADCAST 广播属性
    udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,True)
    
  • 发送数据

    # udp_socket.sendto("哈哈,打不过我吧~".encode(), ("255.255.255.255", 8080))
    udp_socket.sendto("哈哈,打不过我吧~".encode(), ("192.168.150.255", 8080))
    
  • 关闭套接字

    udp_socket.close()

15. [难点]案例:udp聊天器(一)

  • send_msg() 发送信息
  • recv_msg() 接收信息
  • main() 主入口

16. [难点]案例:udp聊天器(二)

  • 发送信息

    input()

    udp_socket.sendto(content.encode(), (ipaddr, int(port)))

  • 接收信息:

        recv_data, ip_port = udp_socket.recvfrom(1024)
        # 2)解码数据
        recv_text = recv_data.decode()
        # 3)输出显示
        print("接收到[%s]的消息:%s" % (str(ip_port), recv_text))
    

以上是关于Python网络开发基础,实现udp聊天器小案例的主要内容,如果未能解决你的问题,请参考以下文章

Python制作一个私人的简易聊天器,邀请ta来激情的聊天吧,搭建UDP网络通信模型

Python装饰器与GIL锁解释

socket网络编程之udp聊天器

Python进阶:利用线程实现多任务

就业DAY2_网络编程_udp聊天器--用户可以控制

udp聊天器