python高级 笔记 05(网络通信UDP)

UDP接收端绑定ip

'''
1.导入模块
2.创建套接字
3.绑定端口
4.接受对方发送的数据
5.解码数据
6.输出显示
7.关闭套接字
'''

# 1.导入模块
import socket
# 2.创建套接字
UDP_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 3.绑定端口
UDP_socket.bind(("192.168.150.25",6666))
# UDP_socket.bind(("127.0.0.1表示本机ip地址",8888))
# UDP_socket.bind(("",8888)) 空的默认本地ip,以后尽可能写为空,因为一个计算机可能多个网卡,就意味着多个ip地址,写为空,数据都能接收。
# 4.接受对方发送的数据
# 1024 接收缓冲区大小(每次接收多少个字节)
# 解包举例   a,b=(1,2)
# UDP_socket.recvfrom(1024)[0] 是接收的数据
# UDP_socket.recvfrom(1024)[1] 是接收的ip和端口号
recv_data,ip_port = UDP_socket.recvfrom(1024)
# 5.解码数据
print("接受[%s]的信息:%s" % (str(ip_port),recv_data.decode()))
# 6.输出显示
# 7.关闭套接字
UDP_socket.close()

总结

虚拟环境
进入 workon 虚拟环境名
退出 deactivate
创建虚拟环境 mkvirtualenv 虚拟环境名
创建虚拟环境指定路径 用 -p

IPV4和IPV6区别
IPV4: 点分 十进制
范围小
IPV6: 冒号分 十六进制
范围大

ifconfig 查看本机ip地址
ping 对方ip 检测两者能否通讯

知名端口
80 web服务默认端口
21 ftp
22 ssh

端口:知名端口 和 动态端口
知名端口: 0-1023
动态端口: 1024-65535

网络通信方式:面向连接 和 面向无连接方式
面向连接: TCP
通信双方,先建立连接,再通信

面向无连接: UDP
不需要建立连接,一方负责发就完事

使用socket向指定地址和端口发送数据
1,导入模块
import socket
2,创建套接字
socket.socket 一共两个参数
第一个 IPV4 INET
IPV6 INET6
第二个 传输方式
SOCK_DGRAM
SOCK_STREAM
3,发送数据
4,关闭套接字

使用udp方式接受数据
recvfrom
返回值是一个元组
元组第一个元素:接受的数据的二进制
元组的第二个元素:ip和端口号

能够使用encode()和decode()进行编码和解码
encode默认utf8
decode默认utf8

bind绑定端口
两个参数
第一个 ip地址
第二个 端口号

前面内容回复

《系统性能定时监控》
思路:
导入模块
import yagmail
创建发件对象
yagmial.SMTP(user=“发件人邮箱”,password=“邮箱授权码”,host=“发件服务器”)
发送邮件
obj.send("收件人"主体“, ”内容“)
在这里插入图片描述
虚拟环境
创建 mkrvirtualenv 虚拟环境名
进入 workon 虚拟环境名
查看 多少个虚拟环境 workon+ tab键
退出虚拟环境 deactivate

创建指定python版本的虚拟环境
mkvirtualenv -p /usr/bin/python3.6 xxx
在虚拟环境中安装套件: pip install 套件名==版本

网络通讯概述
网络:以共享资源为目的的计算机的集合。

IP地址
ip:网络设备为网络中每一台计算机分配的一个唯一的标识。
ipv4: 点分10进制。
eg: xxx.xxx.xxx.xxx 每一段0-125
40多个亿
ipv6:冒号分16进制。
eg:
2的128次方-1

常用地址是C类地址。
私有IP地址: 172.16.xxx.xxx
192.168.xxx.xxx

本地地址:127.0.0.1

Linux命令
ping 和 ifconfig
ping 检测某个地址是否可达
ifconfig查看当前虚拟机的地址

虚拟机联网方式
NAT:虚拟机和物理主机共用网络。
桥接:虚拟机能获取局域网的IP地址。

ifconfig 查看IP地址

ping 检测某个主机是否可以建立连接。

端口
端口:设备和外界通讯交流的出口。
分为 知名端口 和 动态端口。

知名端口: 0~1023 固定不变,用户不可以占用。
21 FTP服务
22 SSH服务
80 web服务器

端口查看 netstat
查看所有: netstat -an
查看某个端口: netstat -an |grep : 22
查看某个端口,是哪个程序在使用: sudo lsof -i:22

网络传输方式
分为两种: 面向无连接 和 面向有连接。
无连接: 两台计算机通信时,不需要建立连接(逻辑)就可以进行数据的收发,数据可能会丢失。
传输协议:UDP

有连接:两台计算机通信时,需要先建立连接,再通信。
传输协议:TCP

socket:网络通信的基本单元,用于进行数据的发送和接受。
就好比是 快递员。
socket使用 4步走:
1.导入模块: import socket
2.创建套接字:
socket.socket
参数1:socket.AF_INET 使用IPV4
socket.AF_INET6 使用IPV6
参数2: socket.SOCK_DGRAM 使用UDP的传输方式(无连接)
socket.SOCK_STREAM 使用TCP的传输方式(有连接)

udp_socket = socket.socket(socket.AP_INET,socket.SOCK_DGRAM)
使用IPV4,UDP协议传输

3.数据传输
发送数据
udp_socket.sendto(数据,ip和端口号)
数据必须是二进制格式,字符串encode()
ip和端口必须是元组(”IP地址“,端口号)

4.关闭套接字
udp_socket.close()

UDP发送和接受数据
发送
udp_socket.sendto(数据,ip和端口号)
接受
recv_data = udp_socket.recvfrom(1024) 每次接受1024个字节
这里recvfrom会让程序进入等待/阻塞 状态,等到接受到数据以后,再执行。

解码:将收到的二进制转成字符串
recv_data 是一个元组
第一个元素 收到的数据的二进制
第二个元素 发送方的ip和端口号
二进制.decode(“GBK”) 采用gbk方式对第一个元素进行解码

编码转换
编码: 字符串.encode() 默认UTF-8字符串
解码: 字符串.decode() 默认UTF-8字符集

解码失败处理
decode(encoding=“字符集”,errors=“错误处理方式”)
错误处理方式两种: ignore 忽略,strict 严格

UDP绑定端口——发送端
核心方法: bind()
udp_socket.bind(address)
address是一个元组,元组的第一个元素是 字符串类型的IP地址,第二个元素,整数端口号
udp_socket.bind((“192.169.150.25”,8888))

在这里插入图片描述

UDP广播

UDP群发广播信息
1.使用UDP的方式方式广播

范围: 192.168.1.0 ~ 192.168.1.255

192.168.1.255 叫广播地址(范围广播)
255.255.255.255 也是一个广播地址(全宇宙广播🐶)

#!/usr/bin/python3
# coding=utf-8
# Author by Zhenzhou Zhou
'''
1 导入模块
2 创建套接字
3 设置广播权限
4 发送数据
5 关闭套接字
'''
# 1 导入模块
import socket

# 2 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 3 设置广播权限
# PermissionError: [Errno 13] Permission denied  权限被拒绝错误
# 因为套接字默认不允许发送广播,需要开启相关权限
# 开启权限
# socket.SOL_SOCKET默认当前套接字;
# socket.SO_BROADCAST设置广播属性;
# 设为True 表示可以发送广播
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
# 4 发送数据
# udp_socket.sendto("牛牛牛".encode(), ("255.255.255.255", 8080))
udp_socket.sendto("牛牛牛".encode(), ("192.168.150.255", 8080))  # 表示发送这个网络地址,进行广播发送
# 5 关闭套接字
udp_socket.close()

总结:
思路
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)
udp_socket.setsockopt(套接字,属性,属性值)
套接字 socket.SOL_SOCKET
属性名 socket.SO_BROADCAST
属性值 True

4发送数据

udp_socket.sendto(“牛牛牛”.encode(), (“192.168.150.255”, 8080))
或者
udp_socket.sendto(“牛牛牛”.encode(), (“192.168.150.255”, 8080)) # 表示发送这个网络地址,进行广播发送

5关闭套接字

udp_socket.close()

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值