三、python学习之网络-UDP

一、网络概述
1.什么是网络:
    网络就是指将具有独立功能的多台计算机通过通信线路连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台。
    通俗理解网络就是把双方或者多方设备连接起来的一个工具,然后可以进行数据传递。

2. 现实生活中的网络:

    聊天工具:QQ,微信,米聊...,
    浏览器:谷歌浏览器,火狐浏览器,IE浏览器...3.学习网络的目的:

二、IP地址:
1.ip地址的概念:
    ip地址是标识网络中设备的唯一标识.
    表现方式:iPv4:点分十进制; ipv6:十六进制

2.ip地址的作用
    通过ip地址找到网络中唯一一台设备,然后可以给设备发送数据

3.私有ip:
    私有ip就是局域网中使用的IP地址,国际规定有一部分ip地址是在局域网中使用的私有ip的范围,也就是不在公网中使用的IP地址范围:
    10.0.0.0 ~ 10.255.255.255
    172.16.0.0 ~ 172.31.255.255
    192.168.0.0 ~ 192.168.255.255

4.本机ip:
    127.0.0.1表示本机的ip,本机域名是localhost,即本机环回地址。

三、Linux命令-ping和ifconfig:
1.查看网卡信息:ifconfig
   配置网卡信息:sudo ifconfig 网卡名 修改的本机ip

2.测试远程主机连通性:ping
    通常用ping来检测网络是否正常

3.常用方式:
    ping 127.0.0.1 检查本地网卡是否正常
    ping www.baidu.com 检查是否能上公网
    ping 当前局域网的ip地址 检查是否在同一个局域网内

四、端口:
1.什么是端口:
    端口是传输数据的通道,是数据传输的必经之路

2.端口号:
    端口号是使用网络软件的唯一标识.
    一台网络设备的端口号一共有65536个(即2的16次方),0 ~ 65535

3.端口号的划分:
    常用端口号(知名端口号):0 ~ 1023
        FTP:20/21
        Telnet:23
        ssh:22
        HTTP:80
        DNS:53
    动态端口号:1024 ~ 65535
        用于开发程序,一般不是固定分配某种服务,而是动态分配。

4.※如何查看端口号:
    使用netstat -an 命令查看程序所使用的端口号
    sudo lsof -i [tcp/udp]:2425 查看端口号对应的应用程序
    注意: 同一端口号允许不同的传输协议使用

五、网络传输方式-UDP:
1.UDP概念:
    UDP简称用户数据报协议,他是无连接的,不可靠的网络传输协议。
    无需确认对端是否存在,发送端可随时发送数据

2.UDP特点:
    无连接
    不可靠
    资源开销小
    传输速度快
    udp每个数据包最大是64k

3.UDP的优缺点:
    优点:
        传输速度快
        不需要连接,资源开销小
    缺点:
        连接数据不可靠,容易丢包
        没有流量控制

4.UDP使用场景:
    对数据实时传输有要求且质量要求不高的情况

5.UDP小结:
    UDP是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
 
六、socket套接字:
1.不同电脑上的进程之间如何通信

2.什么是socket
    socket(套接字):是进程间通信的工具,他能实现把数据从一方传输到另外一方,完成不同电脑上进程之间的通信。

3.socket的使用场景:
    只要跟网络相关的软件,数据传递都需要使用socket.

七、udp网络程序-发送、接收数据:
1.udp网络程序的流程
    创建客户端套接字
    发送/接收数据
    关闭套接字

2.创建socket:

在python中使用socket模块的函数socket就可以完成

import socket
socket.socket(socket.AddressFamily, socket.Type)

说明:

函数socket.socket创建一个socket的对象,该函数带有两个参数:

AddressFamily:IP地址类型:AF_INET表示IPV4类型;AF_INET6表示IPV6类型

Type:套接字的类型。其中,SOCK_STREAM(流式套接字,主要用于TCP协议);SOCK_DGRAM(数据报套接字,主要用于UDP协议)

创建一个UDP socket

#!/usr/bin/python3
#-*-coding:utf-8-*-

# 导包
import socket

# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 此处为UDP协议实现的功能

# 关闭套接字
udp_socket.close()

3.使用UDP协议发送数据:

代码如下:

#!/usr/bim/python3
#-*-coding:utf-8-*-

# 导包
import socket

# 创建UDP套接字
udp_socket = socket.socket(socket.AF_INTE, socket.SOCK_DGRAM)

# 准备接收方的地址和发送数据
recv_addr = ("192.168.63.137", 9090)    # 注意,接收方的地址是一个元组(host, port)
send_content = input("输入你想发送的数据:")

# 发送数据
# 因为网络传输协议传输的二进制数据,因此,要根据协议的编码方式进行编码(encode)
# 发送的格式为:socket.sendto(data.encode(), Address)
udp_socket.sendto(send_content.encode('gbk'), recv_addr)

# 关闭套接字
udp_socket.close()

4. 发送与接收数据

代码如下:

#!/usr/bin/python
#-*-coding:utf-8-*-

# 导包
import socket

# 创建udp套接字
udp_socket = socket.spcket(socket.AF_INTE, socket.SOCK_DGRAM)

# 准备接收方的地址及数据
recv_addr = ("192.168.63.137", 9090)
send_data = input("输入发送的数据:")

# 发送数据
udp_socket.sendto(send_data.encode('gbk'), recv_addr)

# 准备接受数据
# 当程序执行到这一句时,程序会处于阻塞状态,直到接收到数据才会向下执行
# socket.recvfrom()接收到的数据时元组类型(recvData, Address),且本次接收的数据包最大为1024字节
recv_data,address = udp_socket.recvfrom(1024)

# 显示接收到的数据,同样的,接收到的数据是二进制编码,因此需要进行解码(decode())
print("接收到的数据为:%s", % recv_data.decode('gbk'))
print("对方的地址为:" + str(address))    # 其中address又是一个元组(host, port)

# 关闭套接字
udp_socket.close()

八、关于数据编码与解码:

str->bytes:encode编码
bytes->str:decode解码

其中decode()与encode()方法可以接受参数,其声明分别为:

bytes.decode(encoding="utf-8", errors="strict")
str.encode(encoding="utf-8", errors="strict")

其中的encoding是指在解码编码过程中使用的编码格式,errors是指错误的处理方案。

注意:

  • strict:表示严格按照指定编解码方式进行编码和解码,如果编解码不成功则崩溃
  • ignore:表示忽略编解码不成功的字符,如果编解码不成功程序不会崩溃

九、UDP绑定端口号

1.UDP网络程序-端口号问题:

端口号为什么会变?

因为每个网络程序都需要有一个唯一的端口号,如果在脚本中没有固定端口号,那么每次运行的时候,系统都会随机分配一个端口号。

2. UDP绑定信息:

2.1 绑定信息:

代码如下:

#!/usr/bin/python3
#-*-coding:utf-8-*-

import socket

udp_socket = socket.socket(AF_INET, SOCK_DGRAM)

# 绑定班底的相关信息,如果网络程序不绑定,则系统会随机分配
local_addr = ('', 9090)    # ip一般不写,表示本机的任何一个ip
udp_socket.bind(local_addr)

# udp协议功能

# 关闭套接字
udp_socket.close()

十、使用UDP发送广播

代码如下:(飞秋广播消息发送)

#!/usr/bin/python3
# -*-coding:utf-8-*-

import socket

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 开启广播
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)

addr = ("255.255.255.255",2425)

# 飞秋消息头
head = '1_lbt4_10#32899#002481627512#0#0#0:1289671407:大佬:苹果梨电脑:288:'

# 死循环防止程序退出
while True:
    data = input(">")
    if not data:
        break
    data = head + data
    udp_socket.sendto(data.encode('gbk'), addr)

udp_socket.close()

其中:开启广播选项:

socket.setsockopt(socket.SOL_SOCKET, sock.SO_BROADCAST, True)
socket.SOL_socket: 当前套接字
sock.SO_BROADCAST: 广播选项
True: 开启

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅弋、璃鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值