目录
网络编程(二)
解决粘包问题
粘包主要问题是,服务端第一次发送数据,客户端无法精确一次性接受完毕,下一次发送的数据与上一次数据粘在一起.
- 无法预测对方需要接收的数据大小长度.
- 多次连续发送数据量小,并且时间间隔短的数据一次性打包发送
==缺点==:程序的运行速度远快于网络传输速度,所以在发送一段字节前,先用send去发送该字节流长度,这种方式会放大网络延迟带来的性能损耗.
TCP:
TCP是一个流式协议,会将多次连续发送数据量小,并且时间间隔短的一次性打包发送.
struct模块:
必须先定义报头,发送报头,再发送真实数据.
即想发送文件,又想发送文件的描述信息.
客户端发送字典给服务端
send_dic={file_name:文件名
file_size:文件的真是长度1000000}
通过json模块序列化成bytes数据
json_data = json.dumps(send_dic)
bytes_data=json_data.encode('utf8')#bytes
先获取字典的报头
header=struct.pack('i',len(bytes_data))
print(header)
服务端接收到字典,并接受文件的真实数据
res = struct.unpack('i', header)[0] print(res)
上传大文件
客户端往服务端上传文件
UDP简单使用
UDP:
UDP是一种传输协议.
1. 不需要建立双向管道
-
不会粘包
-
客户端给服务端发送数据,不需要等待服务端返回接收成功
-
数据容易丢失,数据不安全.
TCP:就好比在打电话.
基于UDP实现QQ聊天室
由于UDP无连接,所以可以同时多个客户端去跟服务端通信
socket server
python内置模块,可以简化socket套接字服务端的代码.
简化TCP与UDP服务端代码
必须要创建一个类