day29
一、数据库的二进制文件
1、存入二进制文件
with open("Tom.jpeg","rb") as file: # 二进制读取
data = file.read()
sql = "update class set image=%s where id=1;"
cur.execute(sql,[data])
db.commit()
2、提取二进制文件
sql = "select name,image from class where id=1;"
cur.execute(sql)
tmp = cur.fetchone()
with open(tmp[0]+'.jpeg',"wb") as f: # 二进制写入
f.write(tmp[1])
二、网络通信标准
1、OSI标准化流程模型
2、TCP/IP模型
三、通信地址
1、IP地址
(1)定义
在网络中标识一台计算机的地址编号。
(2)分类
- IPv4 : 192.168.1.5(点分十进制)
- IPv6 :fe80::80a:76cf:ab11:2d73(冒分十六进制)
(3)相关命令
ifconfig
:查看Linux系统下计算机的IP地址
ping [ip]
:查看计算机的连通性
(4)公网IP与内网IP
公网IP指的是连接到互联网上的公共IP地址,大家都可以访问。
内网IP指的是一个局域网络范围内由网络设备分配的IP地址。
2、端口号
端口:网络地址的一部分,在一台计算机上,每个网络程序对应一个端口。
取值范围:0–65535
端口号特点:一台计算机上的网络应用所使用的端口不会重复。
三、服务端与客户端
- 服务端(Server):服务端是为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据,处理客 户端请求等。
- 客户端(Client) :也称为用户端,是指与服务端相对应,为客户提供一定应用功能的程序,我们平时使用的 手机或者电脑上的程序基本都是客户端程序。
四、UDP传输服务
1、套接字简介socket
是实现网络编程进行传输的一种技术手段。网络上各种各样的网络服务大多都是基于 Socket 来完成通信的。
python中socket有标准库模块。
import socket
2、UDP套接字编程
(1)创建套接字
语法:
变量名 = socket.socket(family,type)
family:网络地址类型。AF_INET表示ipv4、AF_INET6表示ipv6
type:套接字类型 SOCK_DGRAM表示udp套接字(数据报套接字)
返回值:套接字对象
eg:
sockfd = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
(2)绑定地址(服务器端需要)
语法:
变量名.bind(addr)
参数: 二元元组 (ip,port) (‘0.0.0.0’,8888)
port为端口号,可自行设定
- 本地测试 客户端使用127.0.0.1/localhost访问且需要在同一计算机上
sockfd.bind(("127.0.0.1",8888))
- 网络地址,客户端通过192.168.2.232访问 ifconfig查看
sockfd.bind(("192.168.2.232",8888))
- 自动获取地址 等于上面两种情况
sockfd.bind(("0.0.0.0",8888))
(3)消息的收发
1、接受消息
语法:
data,addr = sockfd.recvfrom(buffersize)
功能: 接收UDP消息
参数: 每次最多接收多少字节
返回值: data 接收到的内容(bytes格式)
addr 消息发送方地址 客户端地址
recvfrom函数是阻塞函数,等到有人发消息才会进行下去,不然就等待。类input。
eg:
data, addr = udp_socket.recvfrom(1024)
print(f"从服务端接收:{data.decode()}") # data为字节串,必须转化为字符串
2、发送消息
语法:
n = sockfd.sendto(data,addr)
功能: 发送UDP消息
参数: data 发送的内容 bytes格式
addr 目标地址
返回值:发送的字节数
eg:
n = udp_socket.sendto(b"Thanks", addr)
# 或者
n = udp_socket.sendto("Thanks".encode(), addr)
# 发送时必须以字节串形式发送
3、关闭套接字
sockfd.close()
3、客户端与服务器端的流程图
4、server与client请求与应答示例
"""
UDP服务端
"""
from socket import *
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 绑定地址
udp_socket.bind(("0.0.0.0", 8888))
# 先接收
data, addr = udp_socket.recvfrom(1024)
print(f"从{addr}收到:{data.decode()}") # 收到的是字节串,要转化为字符串
# 后发数据
n = udp_socket.sendto(b"Thanks", addr)
print(f"发了{n}个字节")
udp_socket.close()
"""
udp客户端
"""
from socket import *
# 服务端地址
ADDR = ("192.168.2.232", 8888)
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 先发
msg = input(">>")
udp_socket.sendto(msg.encode(), ADDR)
# 后收
data, addr = udp_socket.recvfrom(1024)
print(f"从服务端接收:{data.decode()}")
udp_socket.close()