TCP大文件上传与UDP协议
一、UCP大文件上传(解决粘包问题)
①客户端
import socket, os, json, struct client = socket.socket()
client.connect(('127.0.0.1', 8080))
# 文件大小
file_size = os.path.getsize(r'D:\Desktop\wendang.txt') # 文件名
file_name = '计算机五大.txt' # 然后定义一个字典
d = {
'file_name': file_name,
'file_size': file_size,
'msg': '成功上传'
}
# 定义好字典后,先去转一下json,然后encode
data_bytes = json.dumps(d).encode('utf-8') # 制作字典的报头
header = struct.pack('i', len(data_bytes)) # 发送报头
client.send(header) # 发送字典
client.send(data_bytes) # 然后发送真实数据:打开文件,一行一行读取出来,一行一行的发送
with open(r'D:\Desktop\wendang.txt', 'rb') as f:
for line in f:
client.send(line)
②服务端
import socket, json, struct server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5) while True:
conn, addr = server.accept()
while True:
try:
# 先接收报头
header = conn.recv(4) # 解析报头,获取字典长度
header_len = struct.unpack('i', header)[0] # 接收字典
header_bytes = conn.recv(header_len)
header_dic = json.loads(header_bytes.decode('utf_8'))
print(header_dic) # 打印字典 # 循环接收文件,存储到本地
file_size = header_dic.get('file_size')
file_name = header_dic.get('file_name')
recv_size = 0 # 文件操作
with open(file_name, 'wb') as f:
while recv_size < file_size: # 循环接收
data = conn.recv(1024)
f.write(data)
recv_size += len(data)
print(header_dic.get('msg')) # 文件上传成功后的提示信息 except ConnectionResetError:
break
conn.close()
二、UDP协议(数据报协议):
没有双向通道,传输数据不可靠,可能出现丢包现象
通信速度比较快,发送的数据不会在内存中保留
1、特性:
①UDP协议不存在粘包问题
②客户端可以发空,自带数据报头
③udp可以实现并发的效果
④服务端不存在,也不影响客户端朝服务端发送数据
2、分析:
①UDP叫数据报协议,意味着发消息都带有数据报头
②UDP的server不需要就行监听也不需要建立连接
③启动服务之后只能被动的等待客户端发消息过来,
客户端发消息的时候,带上服务端的地址 client.sendto(b'hello', server_addr)
服务端发消息的时候,带上客户端的地址 server.sendto(msg.upper(), addr)
3、TCP和UDP
TCP:类似于打电话,要确定服务端收到
UDP:类似于发短信,不考虑服务端是否收到
4、UDP简单使用
①服务端
import socket server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080)) msg, addr = server.recvfrom(1024)
server.sendto(msg.upper(), addr)
print(msg, addr)
②客户端
import socket client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080) # 服务端地址,通常写在配置文件中 client.sendto(b'hello', server_addr) msg, addr = client.recvfrom(1024)
print(msg, addr)
5、UDP不存在粘包现象
UDP不存在粘包现象,是由于UDP发送的时候,没有经过Negal算法优化,不会将多个小包合并一次发送出去。另外,在UDP协议的接收端,采用了链式结构来记录每一个到达的UDP包,这样接收端应用程序一次recv只能从socket接收缓冲区中读出一个数据包。也就是说,发送端send了几次,接收端必须recv几次(无论recv时指定了多大的缓冲区)。
①服务端
import socket server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080)) # 验证udp是否粘包:不粘包
msg, addr = server.recvfrom(1024)
print(msg) # b'baby~'
msg1, addr1 = server.recvfrom(1024)
print(msg1) # b'baby~'
msg2, addr2 = server.recvfrom(1024)
print(msg2) # b'baby~'
②客户端
import socket client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080) # 服务端地址,通常写在配置文件中 # 验证udp是否粘包:不粘包
client.sendto(b'baby~', server_addr)
client.sendto(b'baby~', server_addr)
client.sendto(b'baby~', server_addr)
三、基于UDP实现简易版本的QQ
①服务端
import socket server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8080)) while True:
msg,addr = server.recvfrom(1024)
print(msg.decode('utf-8'))
data = input('>>>:').encode('utf-8')
server.sendto(data,addr)
②客户端
import socket client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1',8080) while True:
msg = input('>>>:')
msg = '客户端1的消息:%s'%msg
client.sendto(msg.encode('utf-8'),server_addr)
data,addr = client.recvfrom(1024)
print(data)
四、socketserver模块
1、能够实现并发效果
并发:看起来像同时运行就能称之位并发
2、udp在使用的时候,多个客户端要有一些io操作,不然容易卡死
TCP大文件上传与UDP协议的更多相关文章
- tcp 大文件上传 ,切换目录 及登陆文件加盐处理
实现大文件的传输 服务器 import socketimport jsonimport structsk = socket.socket()sk.bind(("127.0.0.1" ...
- 百万行mysql数据库优化和10G大文件上传方案
百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...
- tomcat相关配置技巧梳理 (修改站点目录、多项目部署、限制ip访问、大文件上传超时等)
tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomcat端口(可参考:分享一例测试环境下nginx+tomcat的视频业务部署记录)2)to ...
- 【原创】用JAVA实现大文件上传及显示进度信息
用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...
- Asp.net mvc 大文件上传 断点续传
Asp.net mvc 大文件上传 断点续传 进度条 概述 项目中需要一个上传200M-500M的文件大小的功能,需要断点续传.上传性能稳定.突破asp.net上传限制.一开始看到51CTO上的这 ...
- 用JAVA实现大文件上传及显示进度信息
一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框 ...
- 使用百度webuploader实现大文件上传
版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
- web大文件上传(web应用---SSH框架)
版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
- 大文件上传插件webupload插件
版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
随机推荐
- 渗透测试环境搭建以及使用sqlmap获取mysql用户数据库密码
通过sqlmap检测sql注入漏洞 安装SQLmap漏洞查看工具 安装渗透测试演练系统DVWA 使用SQLmap进行sql注入并获得后台管理员adnim帐号和密码 环境介绍 安装SQLmap:Rich ...
- Spring Cloud 使用Feign调用服务传递Header中的参数
1.使用Feign 调用其他微服务,尤其是在多级调用的同时,需要将一些共同的参数传递至下一个服务,如:token.比较方便的做法是放在请求头中,在Feign调用的同时自动将参数放到restTempla ...
- Linux学习笔记(14)linux在6.x和7.x系列的安装与基本使用区别
关键词,centos7 centos6.x安装与使用:https://www.cnblogs.com/gered/p/9440551.html centos7.x安装与使用(本文)转自:https:/ ...
- 【6.28校内test】T3 【音乐会】道路千万条
[音乐会]道路千万条[题目链接] 首先,你可以忽略上面的一大坨题面,只需要看说明的那一小部分就好啦. 然后理解题意: 就是说我们要给这n-1个运算符指定一个顺序,统计所有值为true的方案数pt,统计 ...
- C++中类模板的概念和意义
1,在 C++ 中是否能够将泛型的思想应用于类? 1,函数模板是将泛型编程的思想应用于函数,就有了函数模板: 2,可以,常用的 C++ 标准库就是 C++ 中的标准模板库,C++ 中的 STL 就是将 ...
- 常用的PHP函数封装,有排序和数据库操作函数
//二分查找 function bin_sch($array, $low, $high, $k) { if ($low <= $high) { $mid = intval(($low + $hi ...
- Python 经典面试题(一)
一.浮点数运算 题目 判断浮点数的运行结果是否相等: a = 0.1 b = 0.2 c = 0.3 assert a + b == c 题目解析: 本题考查的是计算机的浮点运算知识点.不仅是 py ...
- leetcode957. N 天后的牢房
8 间牢房排成一排,每间牢房不是有人住就是空着. 每天,无论牢房是被占用或空置,都会根据以下规则进行更改: 如果一间牢房的两个相邻的房间都被占用或都是空的,那么该牢房就会被占用. 否则,它就会被空置. ...
- 【leetcode 476】. Number Complement
给定一个正整数,输出其补码. 思路:利用mask掩码进行异或, 利用 temp >> 1 大于0 来决定mask长度,求出的mask 为二进制 1 0 0 0 0类型, ...
- 破解phpStorm 2018 亲测
网上教程很多,这里我就不多赘述,我也是看其他教程试过来的. 下面分步骤介绍一下: 1.下载,我这里选用的版本是 phpStorm 2018.3 ,下载地址 https://www.newasp.net ...