一、网络概述
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: 开启