0
点赞
收藏
分享

微信扫一扫

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


Python 进阶篇-系列文章全篇


文章目录

  • Python 进阶篇-系列文章全篇
  • 1. 实战:《系统性能定时监控》-邮件监控
  • 2. 虚拟环境
  • 3. 网络通信概述
  • 4. [重点]ip地址(重点)
  • 5. Linux命令(ping、ifconfig等)
  • 6. [重点]端口(重点)
  • 7. [重点]网络传输方式
  • 8. [重点]socket简介
  • 9. [重点]udp网络程序-发送数据
  • 10. [重点]udp网络程序-发送并接收数据
  • 11. [重点]python3编码转换
  • 12. udp绑定端口-发送端
  • 13. [重、难点]udp绑定端口-接收端
  • 14. UDP广播
  • 15. [难点]案例:udp聊天器(一)
  • 16. [难点]案例: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))


举报

相关推荐

0 条评论