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 ...
随机推荐
- MySQL数据库常用引擎
在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyIASM. 首先: 1.简单介绍这两种引擎,以及该如何去选择.2.这两种引擎所使用的数据结构是什么. 1. a.Innodb引擎,Inn ...
- HDU-4507-吉哥系列故事-恨7不成妻
题目描述 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 ...
- 02:Redis常见面试题
1.1 redis基础面试题 1.什么是Redis?简述它的优缺点? 1. Redis本质上是一个Key-Value类型的内存数据库,很像memcached. 2. 整个数据库统统加载在内存当中进行操 ...
- python-day1(学前了解)
Markdown基本语法 各级标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 加粗 **加粗文本** 斜体 *我斜了* 高亮 ==我高亮了== 上标 2 ...
- P1399 [NOI2013]快餐店
传送门 基环树的题当然先考虑树上怎么搞,直接求个直径就完事了 现在多了个环,先把非环上的直径(设为 $ans$)和环上节点 $x$ 到叶子的最大距离(设为 $dis[x]$)求出来 考虑到对于某种最优 ...
- [.net core]2.hello word(.net core web app模版简介)
创建一个.net core web app project 弹出这个窗口 empty代表 最低依赖, 意味着往往需要手动按需添加依赖. web应用程序(模型视力控制器) 则会帮你创建好control ...
- C# 并行编程之早起三件事
故事背景 透着纱的窗外的阳光, 又是一个星期一. 慢慢来 一看时间, 还早, 那么蹦跶起来 穿衣 刷牙 洗脸 用代码来说的话, 应该是这样: // Program.cs using System; u ...
- jstl用法 简介
<c:choose> <c:when test="${salary <= 0}"> 太惨了. </c:when> <c:when t ...
- java复习(1)面向对象
一.面向对象的概念 ----------------------------------------------------- 1.理解面向对象:(1)面向对象是相对于面向过程的语言 (2)面向对象和 ...
- 使用vue-cli构建vue项目流程
下载: nodejs 安装 npm vue-cli -g 生成项目 vue init webpack elementui2 (elementui2是我的项目名称) 进入项目 cd elementui2 ...