Python网络开发基础,实现udp聊天器小案例
Posted 黑马程序员官方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python网络开发基础,实现udp聊天器小案例相关的知识,希望对你有一定的参考价值。
文章目录
- 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))
以上是关于Python网络开发基础,实现udp聊天器小案例的主要内容,如果未能解决你的问题,请参考以下文章