基于TCP的大文件上传服务端实现

# 服务端
# -*- coding: utf-8 -*- from socket import *
import json, struct server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1', 8080)) # 本地循环地址
server.listen(5) while True:
# 链接循环 accept() -> (socket object, address info)
conn, addr = server.accept()
try:
# 先接收报头
header = conn.recv(4)
# 解析报头获取字典长度 unpack(fmt, buffer) -> (v1, v2, ...)
header_len = struct.unpack('i', header)[0]
# 获取字典
dic_bytes = conn.recv(header_len)
dic_json = dic_bytes.decode('utf-8')
dic = json.loads(dic_json)
file_size = dic.get('file_size')
file_name = 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(dic.get('msg'))
conn.send('文件传输成功'.encode('utf-8'))
except ConnectionResetError:
break
#客户端

# -*- coding: utf-8 -*-
import socket
import os
import json
import struct client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080)) # 文件大小和名字
file_size = os.path.getsize(r'E:测试视频.mp4') # 文件地址自己写入
file_name = '性感荷官在线发牌.mp4'
# 定义一个字典
dic = {
'file_size': file_size,
'file_name': file_name,
'msg': '注意身体哟'
}
dic_bytes = json.dumps(dic).encode()
# 制作字典报头
dic_header = struct.pack('i', len(dic_bytes))
# 发送报头
client.send(dic_header)
# 发送字典
client.send(dic_bytes)
# 发送文件
with open(r'E:测试视频.mp4', 'rb') as f:
for line in f:
client.send(line) data = client.recv(1024).decode('utf-8')
print(data)

基于TCP协议的大文件传输(粘包问题处理)的更多相关文章

  1. 网络编程应用:基于TCP协议【实现文件上传】--练习

    要求: 基于TCP协议实现一个向服务器端上传文件的功能 客户端代码: package Homework2; import java.io.File; import java.io.FileInputS ...

  2. 网络编程应用:基于TCP协议【实现对象传输】--练习

    要求: 基于TCP协议实现,客服端向服务器发送一个对象 服务器接受并显示用户信息 ,同时返回给客户端 "数据已收到" 建一个Student类,属性:name age Student ...

  3. 用scala实现一个基于TCP Socket的快速文件传输程序

    这是用scala实现的一个简单的文件传输程序. 服务端 package jpush import java.io.{DataInputStream, File, FileOutputStream} i ...

  4. 转:wcf大文件传输解决之道(1)

    首先声明,文章思路源于MSDN中徐长龙老师的课程整理,加上自己的一些心得体会,先总结如下: 在应对与大文件传输的情况下,因为wcf默认采用的是缓存加载对象,也就是说将文件包一次性接受至缓存中,然后生成 ...

  5. 简单实现TCP下的大文件高效传输

    简单实现TCP下的大文件高效传输 在TCP下进行大文件传输不象小文件那样直接打包个BUFFER发送出去,因为文件比较大所以不可能把文件读到一个BUFFER发送出去.主要有些文件的大小可能是1G,2G或 ...

  6. tcp上传大文件举例、udp实现qq聊天、socketserver模块实现并发

    为什么会出现粘包现象(day31提到过,这里再举个例子) """首先只有在TCP协议中才会出现粘包现象,因为TCP协议是流式协议它的特点是将数据量小并且时间间隔比较短的数 ...

  7. python tcp黏包和struct模块解决方法,大文件传输方法及MD5校验

    一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...

  8. 用c++开发基于tcp协议的文件上传功能

    用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...

  9. 基于TCP协议的项目架构之Socket流传输的实现

    项目背景  某银行的影像平台由于使用时间长,服务器等配置原因,老影像系统满足不了现在日益增长的数据量的需求,所以急需要升级改造.传统的影像平台使用的是Oracle数据库和简单的架构来存储数据(视频.图 ...

随机推荐

  1. web服务本质

    目录 django 框架引入: web框架本质 HTTP协议 多功能web服务 封装,分发处理 django 框架引入: web框架本质 web框架本质: 软件开发架构: c / s ; b/ s - ...

  2. springboot事务

    参考: 1.https://www.cnblogs.com/kesimin/p/9546225.html https://www.cnblogs.com/east7/p/10585724.html

  3. GitHub for mobile 来了,码农苦逼了!

    北京时间 2019 年 11 月 14 日 GitHub Universe 2019 大会上,GitHub 正式发布了 GitHub for mobile,即 GitHub 的移动版本,支持 iOS ...

  4. 怎么删除iOS模拟器上的应用程序?

    怎么删除iOS模拟器上的应用程序: 和手机上一样,鼠标长按,点击删除 xcode 卸载模拟器 Simulator:删除目录/Library/Developer/CoreSimulator/Profil ...

  5. 安装gerrit服务器

    一.环境准备 1.Java环境 gerrit依赖,用于安装gerrit环境. 下载:jdk-7u79-linux-x64.tar.gz http://www.oracle.com/technetwor ...

  6. java 查找指定包下的类

    package com.jason.test; import java.io.File; import java.io.IOException; import java.io.UnsupportedE ...

  7. DestroyImmediate和Destroy

    DestroyImmediate立即对对像进行销毁并从内存中移除: Destroy销毁场景中的物体,但内存中还存在,当令它需要销毁时,只是给一个标识.而内存中它依然是存在的,只有当内存不够,或一段时间 ...

  8. gevent介绍(转)

    原文:https://www.liaoxuefeng.com/wiki/897692888725344/966405998508320 Python通过yield提供了对协程的基本支持,但是不完全.而 ...

  9. 「NOI2018」冒泡排序

    「NOI2018」冒泡排序 考虑冒泡排序中一个位置上的数向左移动的步数 \(Lstep\) 为左边比它大的数的个数,向右移动的步数 \(Rstep\) 为右边比它大的数的个数,如果 \(Lstep,R ...

  10. 『Tree nesting 树形状压dp 最小表示法』

    Tree nesting (CF762F) Description 有两个树 S.T,问 S 中有多少个互不相同的连通子图与 T 同构.由于答案 可能会很大,请输出答案模 1000000007 后的值 ...