网络编程(二)

网络编程(二)

解决粘包问题

粘包主要问题是,服务端第一次发送数据,客户端无法精确一次性接受完毕,下一次发送的数据与上一次数据粘在一起.

  1. 无法预测对方需要接收的数据大小长度.
  2. 多次连续发送数据量小,并且时间间隔短的数据一次性打包发送

==缺点==:程序的运行速度远快于网络传输速度,所以在发送一段字节前,先用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. 不需要建立双向管道

  1. 不会粘包

  2. 客户端给服务端发送数据,不需要等待服务端返回接收成功

  3. 数据容易丢失,数据不安全.

    TCP:就好比在打电话.

    UDP:就好比在发短信.

基于UDP实现QQ聊天室

由于UDP无连接,所以可以同时多个客户端去跟服务端通信

socket server

​ python内置模块,可以简化socket套接字服务端的代码.

​ 简化TCP与UDP服务端代码

​ 必须要创建一个类

posted @ 2019-10-18 15:48  Mr-Allen  阅读(77)  评论(0编辑  收藏  举报