2018.8.7
目录
day01回顾
1,osi七层模型---》四层 五层
2,三次握手,四次挥手
3,tcp和udp区别
网络概念:主机 端口 ip 协议
- 服务端:localhost / 127.0.0.1
- 客户端:只是在本机启动客户端 用127.0.0.1访问
- 服务端:0.0.0.0
- 客户端:可以在本机用127.0.0.1、172.60.50.181访问,
局域网内用 172.60.50.181
- 服务端:172.60.50.181
- 客户端:局域网内用 172.60.50.181访问
套接字 socket
- 流式套接字 --》 tcp 可靠地 有连接
- 数据报套接字 --》udp 不可靠 无连接
tcp服务端
socket --> bind --> listen --> accept --> recv/send -->close
day02
recv() 特征
- *如果连接的另一端断开连接,则recv立即返回空字符串
- recv是从接受缓冲区取出内容,当缓冲区为空则阻塞
- recv如果一次接受不完缓冲区内容,下次会继续接收
send() 特征
- *如果发送的另外一段不存在则会产生pipe Broken
- recv是向发送缓冲区发送内容,当缓冲区为满阻塞
网络收发缓冲区
- 在内存中开辟的区域,用作发送和接受的缓冲
- 协调数据的收发(接受和处理)速度
- 减少和磁盘的交互
sendall(data)
- 功能:tcp套接字发送消息
- 参数:同send
- 返回值:如果发送成功返回None
tcp粘包
- 产生原因:
tcp传输以字节流的方式发送消息,消息之间没有边界
发送比接收的速度快,此时如果发送和接收速度不匹配就会产生粘包 - 影响:对每次发送的内容是一个独立的意思需要单独识别,如果发送的内容本身就是连续的整体,此时不需要处理粘包
- 如何处理
1,每次发送后加一个结尾标志
2,发送一个数据结构
3,每次发送有一个间隔
基于udp的服务端编程
- 创建套接字
sockfd = socket(AF_INET,SOCK_DGRAM) - 绑定地址
sockfd.bind() - 消息的收发
- 接收
- 格式:data,addr = sockfd.recvfrom(buffersize)
- 功能:接收UDP消息
- 参数:每次最多接收消息的大小,字节
- 返回值:data接收到的内容
addr 消息发送方的地址 - recvfrom 一次接收一个数据包,如果数据包超出了一次能够接收的大小则会丢失没有收到的内容
- 发送
- 格式sockfd.sendto(data,addr)
- 功能 : udp发送消息
- 参数 : data 要发送的内容 bytes
addr 消息要发送给谁(目标地址) - 返回值 : 发送的字节数
- 接收
-
关闭套接字
sockfd.close()
服务器:#utip.py from socket import * HOST = '0.0.0.0' PORT = 8888 ADDR = (HOST,PORT) #创建套接字 sockfd = socket(AF_INET,SOCK_DGRAM) #绑定地址 sockfd.bind(ADDR) #消息收发 while True: data,addr = sockfd.recvfrom(1024) print('Receive from %