OSI 7层模型
7 应用层 各种应用程序
6 表示层 数据格式化、数据加密解密、 数据的压缩解压缩
5 会话层 建立、管理、终止应用之间的会话连接
4 传输层 提供端对端的数据服务(可靠或不可靠)
3 网络层 逻辑寻址;路由选择
2 数据链路层 将分组数据封装成帧;
1 物理层 在介质上传输比特;提供物理的规约
TCP/IP 协议
应用层 Telnet ,FTP ,SMTP,DNS,HTTP 以及其他应用协议
传输层 TCP,UDP
网络层 IP ,ARP,RARP ,ICMP
网络接口层 各种通信网络接口(以太网等)(物理网络)
udp套接字特点
1.可能出现数据丢失的情况
2.传输过程简单,实现容易
3.数据以数据包形式表达传输
4.数据传输效率较高
UDP 套接字编程
1. 创建套接字
sockfd = socket.socket(socket_family,socket_type,proto =0 )
功能:创建套接字
参数:socket_family 网络地址类型
AF_INET 表示ipv4
socket_type 套接字类型
SOCK_DGRAM 表示udp 套接字(也叫数据报套接字)
proto 通常为 0 选择子协议
返回值 : 套接字对象
例 : import socket
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2. 绑定地址
sockfd .bind(addr)
功能:绑定本机网络地址
参数:二元组(ip,port) #(“0.0.0.0”,8888) #0.0.0.0 万能地址
例:格式:udp_socket.bind(("0.0.0.0",8888))
或
addr=("0.0.0.0",8888)
udp_socket.bind(addr)
3. 消息收发
data,addr = sockfd.recvfrom(buffersize)
功能:接收UDP消息
参数:每次最多接收多少字节
返回值: data 接收到的内容
addr 消息发送方地址
n = sockfd.sendto(data,addr)
功能:发送UDP消息
参数:data 发送的内容 bytes格式 #所有网络传输需要bytes字节串
bytes 格式
addr 目标地址
返回值:发送的字节数
4. 关闭套接字
sockfd.close()
功能:关闭套接字
例 1 :
UDP-服务端与客户端 :
------------------------ (服务端)
from socket import *
# 创建udp的套接字
udp_socket=socket(AF_INET,SOCK_DGRAM)
# 绑定地址
addr=("0.0.0.0",8888)
udp_socket.bind(addr)
while True:
# 接收与发送一个消息
msg,addr=udp_socket.recvfrom(1024) #如果设置比较小,发送内容比较大就会出现丢包
# 与客户端约定一个特殊的退出命令
# if msg =="##": 一般服务器不退出
# break
print("从网络接收到了:",msg.decode())
udp_socket.sendto(b"Thanks",addr) # 发送对应客户端消息
# 关闭套接字
udp_socket.close()
------------------------(客户端)
from socket import *
#服务端地址
ADDR =("10.14.2.27",8888)
#创建udp的套接字
udp_socket = socket(AF_INET,SOCK_DGRAM)
while True:
#发数据
msg = input(">>")
#客户端结束
if msg =="##":
break
udp_socket.sendto(msg.encode(),ADDR)
data,addr = udp_socket.recvfrom(1024)
print("From server:",data.decode())
#关闭程序
udp_socket.close()
例 2 接收单词,查询数据库是否查找解释并返回给客户端
------------------------------------服务端 —
from socket import *
import pymysql
ADDR = ("0.