在TCP协议下通过socket模块实现文件上传

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # desc: tcp_server_file_upload
  4.  
  5. import socket
  6. import struct
  7. import json
  8. import time
  9.  
  10. IP_PORT = ('127.0.0.1', 8080)
  11. BUFFERSIZE = 1024
  12.  
  13. tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #获取socket对象,并设置通过TCP协议通信
  14. tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#设置连接重用
  15. tcp_server_socket.bind(IP_PORT) #绑定IP地址和端口
  16. tcp_server_socket.listen() #监听,可指定数量
  17.  
  18. conn, addr = tcp_server_socket.accept() #建立连接
  19. print('client ip addr:', addr)
  20. head_struct = conn.recv(4) #接收定制报头的长度
  21. head_json_len = struct.unpack('i', head_struct)[0] #解包,获取定制报头的长度
  22. head_json = conn.recv(head_json_len).decode('utf-8') #根据上一步解包获得的报头长度,接收报头
  23. head = json.loads(head_json) #将json字符串类型的报头转化为python对象
  24. file_size = head['file_size']#获取待接收文件的大小
  25. file_name = head['file_name']#获取接收文件的名字
  26. print(time.strftime('%Y-%m-%d %H:%M:%S'),' 开始接收文件...') #打印开始接收文件的时间
  27. with open(file_name, 'wb') as f: #以二进制写方式打开文件
  28. '''
  29. 循环写入接收的文件内容
  30. '''
  31. while True:
  32. if file_size >= BUFFERSIZE: #如果接收的文件内容大于设置的BUFFERSIZE,就只接收BUFFERSIZE大小的内容
  33. content = conn.recv(BUFFERSIZE) #接收客服端发送的BUFFERSIZE大小的内容
  34. f.write(content) #在服务端写入BUFFERSIZE大小的内容
  35. file_size -= BUFFERSIZE #将待写入的文件大小减去已接收的BUFFERSIZE大小
  36. '''
  37. 主要是用于服务端和客户端在同一PC上,且写入比读取快,从而导致服务端先行关闭,
  38. 造成客户端连接中断,文件传送不完整
  39. '''
  40. time.sleep(0.00001)
  41. else:
  42. content = conn.recv(file_size) #接收文件剩余部分
  43. f.write(content)
  44. break
  45. print(time.strftime('%Y-%m-%d %H:%M:%S'),' 成功接收文件...') #打印文件接收完成时间
  46.  
  47. conn.close() #关闭连接
  48. tcp_server_socket.close() #关闭服务端socket

tcp_server_file_upload

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @desc: tcp_client_file_upload
  4.  
  5. import socket
  6. import struct
  7. import json
  8. import os
  9. import time
  10.  
  11. IP_PORT = ('127.0.0.1', 8080)
  12. BUFFERSIZE = 1024
  13.  
  14. tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #获取socket对象
  15. tcp_client_socket.connect(IP_PORT) #连接服务端
  16.  
  17. '''
  18. 定制化报头
  19. '''
  20. head = {'file_path':r'文件路径',
  21. 'file_name':r'文件名',
  22. 'file_size':0
  23. }
  24.  
  25. file_path = os.path.join(head['file_path'], head['file_name']) #获取要上传文件的完整路径
  26. file_size = os.path.getsize(file_path) #获取文件大小
  27. head['file_size'] = file_size #将获取到的真实文件大小设置到报头
  28.  
  29. head_json = json.dumps(head) #将报头python对象转化为json字符串
  30. head_bytes = bytes(head_json, encoding='utf-8') #将报头json字符串转化为bytes字节码
  31. head_struct = struct.pack('i', len(head_bytes)) #将报头bytes字节码以'integer'类型打包为4个字节
  32. tcp_client_socket.send(head_struct) #发送打包为4个字节的报头
  33. tcp_client_socket.send(head_bytes) #发送定制化报头
  34. print(time.strftime('%Y-%m-%d %H:%M:%S'),' 开始发送文件...') #打印开始发送文件的时间
  35. with open(file_path, 'rb') as f: #以二进制读的方式打开文件
  36. '''
  37. 循环读取文件内容并发送给服务端
  38. '''
  39. while True:
  40. if file_size >= BUFFERSIZE: #如果发送文件的大小大于BUFFERSIZE,只读取BUFFERSIZE大小的内容
  41. content = f.read(BUFFERSIZE) #读取BUFFERSIZE大小的内容
  42. tcp_client_socket.sendall(content) #发送读取的文件内容
  43. file_size -= BUFFERSIZE #文件大小减去已发送文件的大小
  44. else:
  45. content = f.read(file_size) #读取剩余文件内容
  46. tcp_client_socket.sendall(content) #发送文件读取的文件内容
  47. break #终止循环
  48.  
  49. print(time.strftime('%Y-%m-%d %H:%M:%S'),' 文件发送成功...') #大于文件发送完成的时间
  50. tcp_client_socket.close() #关闭socket

tcp_client_file_upload

Python Socket实现文件上传(TCP协议)的更多相关文章

  1. python Django之文件上传

    python Django之文件上传 使用Django框架进行文件上传共分为俩种方式 一.方式一 通过form表单进行文件上传 #=================================== ...

  2. Python 基于Python实现Ftp文件上传,下载

    基于Python实现Ftp文件上传,下载   by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...

  3. [Python] socket实现TFTP上传和下载

    一.说明 本文主要基于socket实现TFTP文件上传与下载. 测试环境:Win10/Python3.5/tftpd64. tftpd下载:根据自己的环境选择下载,地址 :http://tftpd32 ...

  4. Python学习---网络文件上传

    中心思想: 传递过去文件的大小,根据文件的大小判断是否文件上传完成: 传递/接受文件采用分流的形式,每次传递/接受部分数据:  文件的读取均采用绝对路径实现,而且是bytes的形式读写 客户端: # ...

  5. selenium+python自动化77-autoit文件上传

    前言 关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三界之外了,不属于selenium的管辖范围(selenium不是万能的,只能操作web上元素).autoit工 ...

  6. selenium+python自动化77-autoit文件上传【转载】

    前言 关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三界之外了,不属于selenium的管辖范围(selenium不是万能的,只能操作web上元素).autoit工 ...

  7. socket实现文件上传(客户端向服务器端上传照片示例)

    本示例在对socket有了基本了解之后,可以实现基本的文件上传.首先先介绍一下目录结构,server_data文件夹是用来存放客户端上传的文件,client_data是模拟客户端文件夹(目的是为了测试 ...

  8. 任意文件上传——tcp

    package chaoba; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; ...

  9. python模拟浏览器文件上传,csrf放行

    服务器端视图函数 from django.shortcuts import render,HttpResponse from django.views.decorators.csrf import c ...

随机推荐

  1. PHP链接MySQL,查询数据库内容,删除数据库内容。。。记住链接公式!!!

    //扩展类叫MySQLi MySQL是数据库,MySQLi是扩展 Id地址本地网络服务器的地址localhost 如果想链接别人的输入他的服务器id地址. //root代表的是数据库名, //poss ...

  2. 最全面的Android Studio使用教程【申明:来源于网络】

    最全面的Android Studio使用教程[申明:来源于网络] http://www.admin10000.com/document/5496.html

  3. Linux 创建文件系统及挂载文件系统流程详解(转)

    作者:北南南北 来自: LinuxSir.Org 摘要:本文对新增硬盘,切割硬盘,创建硬盘分区,为硬盘分区创建文件系统,以及加载文件系统的流程做总结性论述:主要是为初学者弄清楚这一操作过程:本文涉及f ...

  4. tensorflow的ckpt文件总结

    1.TensorFlow的模型文件 --checkpoint_dir | |--checkpoint | |--MyModel.meta | |--MyModel.data-00000-of-0000 ...

  5. JavaScript:改变 HTML 图像

    JavaScript:改变 HTML 图像 1.代码如下: <!DOCTYPE HTML> <html> <head> <meta charset=" ...

  6. Js高设笔记1-2章 defer and async

    1,js是由ECMAscript ,dom ,bom组成的专为网页交互而设计的脚本语言.js是脚本语言之一. 2,MIME,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的 ...

  7. hive拉链表

    前言 本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理.设计.以及在我们大数据场景下的实现方式. 全文由下面几个部分组成:先分享一下拉链表的用途.什么是拉链表.通过一些小的使用场景来对拉链表做 ...

  8. day2_python基础

    1.变量: 用来存东西的,左边是名字,右边是值 2.python中的单引号.双信号.三引号 单引号和双引号和三引号没什么区别,用哪个都可以,如果定义字符串里面如果有单引号,则外面用双引号;如果字符串里 ...

  9. 《HTTP - http报文》

    还时推荐一首歌 - 那吾克热<纸飞机> 有没有突然想要个孩子的冲动,哈哈. 读 第三章<HTTP报文内的HTTP信息> 总结 1:用于HTTP协议交互叫做HTTP报文,请求端( ...

  10. centos 安装ss

    yum install python-setuptools && easy_install pip pip install shadowsocks vi /etc/shadowsock ...