目录
网络编程知识点回顾
一、协议
1.c/s和b/s架构
c/s:客户端和服务器
b/s:浏览器和服务器,本质上还是客户端和服务器
2.osi五层
- 物理层:高低压电信号
- 数据链路层:数据报、mac地址
- 网络层:IP协议和端口号(IP可以通过arp协议,和mac地址进行转换)
- 传输层:TCP和UDP协议
TCP:基于数据流的可靠协议(三次握手、四次挥手)
UDP:基于数据报的不可靠协议
- 应用层:http协议,邮件协议等
二、 socket
在传输层和应用层之间的一层抽象层,可以操作网络层和传输层
1.用套接字实现tcp协议的通信
2.用套接字实现的UDP协议的通信
3.发生粘包的两种情况
- 发送端需要等缓冲区满才发送出去,造成粘包(发送时间间隔很短,数据又很小,会合到一起,产生粘包)
- 接收端不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次手的时候还是从缓冲区呐上次一流的数据,产生粘包)
4.解决粘包的问题
为字节流加上固定的报头,报头中含有字节流的长度,一次send到对端,对端在接收时,先从缓存中取出定长的报头,然后再取真实数据。
struct()模块,将数据长度打包为四个int型的字节
把报头做成字典,字典里面包含将要发送的真实数据的信息,,然后json序列化,然后用struck将序列化后的数据长度打包成4个字节,一同send到对端
发送时: 先发报头长度 再编码报头内容然后发送 最后发真实内容 接收时: 先手报头长度,用struct取出来 根据取出的长度收取报头内容,然后解码,反序列化 从反序列化的结果中取出待取数据的详细信息,然后去取真实的数据内容
5.UDP协议
用udp实现简单通信
#服务器 import socket soc= socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #socket.SOCK_DGRAM是UDP协议 soc.bind(('127.0.0.1',8080)) #绑定地址和端口号 while True: #通信循环 data,addr = soc.recvfrom(1024) #无需等待接收和监听 print(data) soc.sendto(data.upper(),addr) #将处理好的数据发送给客户端
#客户端 import socket soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #实例化一个对象 while True: #通信循环 msg= input('请输入数据>>>').strip() msg = msg.encode('utf8') #将数据转化为bytes格式 soc.sendto(msg,('127.0.0.1',8080)) data = soc.recvfrom(1024) #接收数据 print(data[0]) #打印数
udp的特点:
可以发送空内容
不需要建立连接
客户端和服务端谁断开都不影响发送
不会粘包
6.socketserver模块
1) socketserver模块实现TCP简单通信
服务端
* 导入模块
* 定义一个类
* 类中必须重新handle方法
* handle里面写一些简单的逻辑
* `if __name__ == '__main__':`
* 实例化一个socketserver对象:`soc= socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTcp)`
* `soc.serve_forever() `
客户端:用socket模块就行
2)socketserver模块实现UDP简单通信
书写步骤同上