一、UCP大文件上传(解决粘包问题)

①客户端

  1. import socket, os, json, struct
  2.  
  3. client = socket.socket()
  4. client.connect(('127.0.0.1', 8080))
  5. # 文件大小
  6. file_size = os.path.getsize(r'D:\Desktop\wendang.txt')
  7.  
  8. # 文件名
  9. file_name = '计算机五大.txt'
  10.  
  11. # 然后定义一个字典
  12. d = {
  13. 'file_name': file_name,
  14. 'file_size': file_size,
  15. 'msg': '成功上传'
  16. }
  17. # 定义好字典后,先去转一下json,然后encode
  18. data_bytes = json.dumps(d).encode('utf-8')
  19.  
  20. # 制作字典的报头
  21. header = struct.pack('i', len(data_bytes))
  22.  
  23. # 发送报头
  24. client.send(header)
  25.  
  26. # 发送字典
  27. client.send(data_bytes)
  28.  
  29. # 然后发送真实数据:打开文件,一行一行读取出来,一行一行的发送
  30. with open(r'D:\Desktop\wendang.txt', 'rb') as f:
  31. for line in f:
  32. client.send(line)

②服务端

  1. import socket, json, struct
  2.  
  3. server = socket.socket()
  4. server.bind(('127.0.0.1', 8080))
  5. server.listen(5)
  6.  
  7. while True:
  8. conn, addr = server.accept()
  9. while True:
  10. try:
  11. # 先接收报头
  12. header = conn.recv(4)
  13.  
  14. # 解析报头,获取字典长度
  15. header_len = struct.unpack('i', header)[0]
  16.  
  17. # 接收字典
  18. header_bytes = conn.recv(header_len)
  19. header_dic = json.loads(header_bytes.decode('utf_8'))
  20. print(header_dic) # 打印字典
  21.  
  22. # 循环接收文件,存储到本地
  23. file_size = header_dic.get('file_size')
  24. file_name = header_dic.get('file_name')
  25. recv_size = 0
  26.  
  27. # 文件操作
  28. with open(file_name, 'wb') as f:
  29. while recv_size < file_size: # 循环接收
  30. data = conn.recv(1024)
  31. f.write(data)
  32. recv_size += len(data)
  33. print(header_dic.get('msg')) # 文件上传成功后的提示信息
  34.  
  35. except ConnectionResetError:
  36. break
  37. 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简单使用

①服务端

  1. import socket
  2.  
  3. server = socket.socket(type=socket.SOCK_DGRAM)
  4. server.bind(('127.0.0.1', 8080))
  5.  
  6. msg, addr = server.recvfrom(1024)
  7. server.sendto(msg.upper(), addr)
  8. print(msg, addr)

②客户端

  1. import socket
  2.  
  3. client = socket.socket(type=socket.SOCK_DGRAM)
  4. server_addr = ('127.0.0.1', 8080) # 服务端地址,通常写在配置文件中
  5.  
  6. client.sendto(b'hello', server_addr)
  7.  
  8. msg, addr = client.recvfrom(1024)
  9. print(msg, addr)

5、UDP不存在粘包现象

UDP不存在粘包现象,是由于UDP发送的时候,没有经过Negal算法优化,不会将多个小包合并一次发送出去。另外,在UDP协议的接收端,采用了链式结构来记录每一个到达的UDP包,这样接收端应用程序一次recv只能从socket接收缓冲区中读出一个数据包。也就是说,发送端send了几次,接收端必须recv几次(无论recv时指定了多大的缓冲区)。

①服务端

  1. import socket
  2.  
  3. server = socket.socket(type=socket.SOCK_DGRAM)
  4. server.bind(('127.0.0.1', 8080))
  5.  
  6. # 验证udp是否粘包:不粘包
  7. msg, addr = server.recvfrom(1024)
  8. print(msg) # b'baby~'
  9. msg1, addr1 = server.recvfrom(1024)
  10. print(msg1) # b'baby~'
  11. msg2, addr2 = server.recvfrom(1024)
  12. print(msg2) # b'baby~'

②客户端

  1. import socket
  2.  
  3. client = socket.socket(type=socket.SOCK_DGRAM)
  4. server_addr = ('127.0.0.1', 8080) # 服务端地址,通常写在配置文件中
  5.  
  6. # 验证udp是否粘包:不粘包
  7. client.sendto(b'baby~', server_addr)
  8. client.sendto(b'baby~', server_addr)
  9. client.sendto(b'baby~', server_addr)

三、基于UDP实现简易版本的QQ

①服务端

  1. import socket
  2.  
  3. server = socket.socket(type=socket.SOCK_DGRAM)
  4. server.bind(('127.0.0.1',8080))
  5.  
  6. while True:
  7. msg,addr = server.recvfrom(1024)
  8. print(msg.decode('utf-8'))
  9. data = input('>>>:').encode('utf-8')
  10. server.sendto(data,addr)

②客户端

  1. import socket
  2.  
  3. client = socket.socket(type=socket.SOCK_DGRAM)
  4. server_addr = ('127.0.0.1',8080)
  5.  
  6. while True:
  7. msg = input('>>>:')
  8. msg = '客户端1的消息:%s'%msg
  9. client.sendto(msg.encode('utf-8'),server_addr)
  10. data,addr = client.recvfrom(1024)
  11. print(data)

四、socketserver模块

1、能够实现并发效果
   并发:看起来像同时运行就能称之位并发
 2、udp在使用的时候,多个客户端要有一些io操作,不然容易卡死

TCP大文件上传与UDP协议的更多相关文章

  1. tcp 大文件上传 ,切换目录 及登陆文件加盐处理

    实现大文件的传输 服务器 import socketimport jsonimport structsk = socket.socket()sk.bind(("127.0.0.1" ...

  2. 百万行mysql数据库优化和10G大文件上传方案

    百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...

  3. tomcat相关配置技巧梳理 (修改站点目录、多项目部署、限制ip访问、大文件上传超时等)

    tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomcat端口(可参考:分享一例测试环境下nginx+tomcat的视频业务部署记录)2)to ...

  4. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  5. Asp.net mvc 大文件上传 断点续传

    Asp.net mvc 大文件上传 断点续传 进度条   概述 项目中需要一个上传200M-500M的文件大小的功能,需要断点续传.上传性能稳定.突破asp.net上传限制.一开始看到51CTO上的这 ...

  6. 用JAVA实现大文件上传及显示进度信息

    一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框 ...

  7. 使用百度webuploader实现大文件上传

    版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

  8. web大文件上传(web应用---SSH框架)

    版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

  9. 大文件上传插件webupload插件

    版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

随机推荐

  1. MySQL数据库常用引擎

    在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyIASM. 首先: 1.简单介绍这两种引擎,以及该如何去选择.2.这两种引擎所使用的数据结构是什么. 1. a.Innodb引擎,Inn ...

  2. HDU-4507-吉哥系列故事-恨7不成妻

    题目描述 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 ...

  3. 02:Redis常见面试题

    1.1 redis基础面试题 1.什么是Redis?简述它的优缺点? 1. Redis本质上是一个Key-Value类型的内存数据库,很像memcached. 2. 整个数据库统统加载在内存当中进行操 ...

  4. python-day1(学前了解)

    Markdown基本语法 各级标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 加粗 **加粗文本** 斜体 *我斜了* 高亮 ==我高亮了== 上标 2 ...

  5. P1399 [NOI2013]快餐店

    传送门 基环树的题当然先考虑树上怎么搞,直接求个直径就完事了 现在多了个环,先把非环上的直径(设为 $ans$)和环上节点 $x$ 到叶子的最大距离(设为 $dis[x]$)求出来 考虑到对于某种最优 ...

  6. [.net core]2.hello word(.net core web app模版简介)

    创建一个.net core web app project 弹出这个窗口 empty代表 最低依赖,  意味着往往需要手动按需添加依赖. web应用程序(模型视力控制器) 则会帮你创建好control ...

  7. C# 并行编程之早起三件事

    故事背景 透着纱的窗外的阳光, 又是一个星期一. 慢慢来 一看时间, 还早, 那么蹦跶起来 穿衣 刷牙 洗脸 用代码来说的话, 应该是这样: // Program.cs using System; u ...

  8. jstl用法 简介

    <c:choose> <c:when test="${salary <= 0}"> 太惨了. </c:when> <c:when t ...

  9. java复习(1)面向对象

    一.面向对象的概念 ----------------------------------------------------- 1.理解面向对象:(1)面向对象是相对于面向过程的语言 (2)面向对象和 ...

  10. 使用vue-cli构建vue项目流程

    下载: nodejs 安装 npm vue-cli -g 生成项目 vue init webpack elementui2 (elementui2是我的项目名称) 进入项目 cd elementui2 ...